Docker Cheat Sheet

/ 技术文章 / 0 条评论 / 730浏览

Docker Cheat Sheet

常用命令


# 容器操作
docker build -t friendlyname .# 使用此目录的 Dockerfile 创建镜像
docker run -p 4000:80 friendlyname  # 运行端口 4000 到 90 的“友好名称”映射
docker run -d -p 4000:80 friendlyname         # 内容相同,但在分离模式下
docker ps                                 # 查看所有正在运行的容器的列表
docker stop <hash>                     # 平稳地停止指定的容器
docker ps -a           # 查看所有容器的列表,甚至包含未运行的容器
docker kill <hash>                   # 强制关闭指定的容器
docker rm <hash>              # 从此机器中删除指定的容器
docker rm $(docker ps -a -q)           # 从此机器中删除所有容器
docker images -a                               # 显示此机器上的所有镜像
docker rmi <imagename>            # 从此机器中删除指定的镜像
docker rmi $(docker images -q)             # 从此机器中删除所有镜像

# 登录Registry
docker login             # 使用您的 Docker 凭证登录此 CLI 会话
docker tag <image> username/repository:tag  # 标记 <image> 以上传到镜像库
docker push username/repository:tag            # 将已标记的镜像上传到镜像库
docker run username/repository:tag                   # 运行镜像库中的镜像

# 创建本地Repository
docker service create --name registry --publish 5000:5000 registry:2 # 创建registry服务
docker tag myimage localhost:5000/myimage # 标记镜像
docker push localhost:5000/myimage # 推送镜像
docker service create --name myservice localhost:5000/myimage # 使用镜像

# 栈 & 服务
docker stack ls              # 列出此 Docker 主机上所有正在运行的应用
docker stack deploy -c <composefile> <appname>  # 运行指定的 Compose 文件
docker stack services <appname>       # 列出与应用关联的服务
docker stack ps <appname>   # 列出与应用关联的正在运行的容器
docker stack rm <appname>    # 清除应用


docker service inspect <stack_name_service_name>  # 服务部署详情
docker service logs <stack_name_service_name>      # 服务容器,包括所有容器
docker service rm <stack_name_service_name>  # 删除栈内服务

# 卷
docker volume create <volume_name> # 创建docker卷, 本地文件夹在/var/lib/docker/volumes/<volume_name> 目录下
docker volume inspect <volume_name> # 查看卷详情
docker run -d -p 9000:9000 -v <volume_name>:/<target_path> <friendly_image_name> # 在容器中挂载卷

docker rm <volume_name> [<volume_name_1> <volume_name_2> ...] # 删除一个或多个卷
docker volume rm $(docker volume ls -qf dangling=true) # 批量删除一流的无用分卷
docker volume prune # 清除所有无用分卷
docker rm -vf <container_id> # 删除容器时,删除该容器使用的临时分卷


其他坑

Windows上每次创建docker-machine都要下载boot2docker

# Window 7
docker-machine create --virtualbox-boot2docker-url=file:///Users/fengfan_zheng/.docker/machine/cache/boot2docker.iso --driver virtualbox default 

# Windows 10 hyperv
docker-machine create  --hyperv-boot2docker-url=file:///Users/fengfan_zheng/.docker/machine/cache/boot2docker.iso -d hyperv --hyperv-virtual-switch "docker-switch-01" master01

Windows 上创建的docker machine启动失败

Windwos 10 上创建的docker-machine十有八九是失败的,报错Error creating machine: Error in driver during machine creation: exit status 1 手动启动之后,还会有证书问题。最后网上查了一下是内存分配的问题,要给虚拟机至少2G内存,记住,要去hyper-v配置界面改,而不是docker settings:

  1. 失败后,手动运行 docker-machine start [machinename]
  2. 等,等到docker-machine成功启动
  3. 手工诚信生成ssh证书 docker-machine regenerate-certs [machinenam]

或者创建的时候带参数

docker-machine create  --hyperv-boot2docker-url=file:///Users/fengfan_zheng/.docker/machine/cache/boot2docker.iso --hyperv-cpu-count "2" --hyperv-memory "2048"  -d hyperv --hyperv-virtual-switch "docker-switch-01" master01

Winodws7 上 docker swarm init

在Windows7上运行docker-machine ssh myvm1 "docker swarm init"是有问题的,会报个需要使用--advertise-addr 的错误.。 这时候最安全的做法是,使用docker-machine shh <machine-name>连上docker-machine,再会话中初始化swarm

localhost:>docker-machine shh myvm1 

docker@myvm1:> docker swarm init --advertise-addr 192.168.99.100:2377
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-51ydykj4qmo8g5ti98bxd7c4l13aubrydqbetc8aa
b50xn3qny-9rpzb9lfbo01md605i9wo08dp 192.168.99.100:2377

docker@myvm1:> exit

localhost:>docker-machine shh myvm2
docker@myvm2:> docker swarm join --token SWMTKN-1-51ydykj4qmo8g5ti98bxd7c4l13aubrydqbetc8aab50xn3qny-9rpzb9lfbo01md605i9wo08dp 192.168.99.100:2377
This node joined a swarm as a worker.

docker@myvm2:> exit

Windows7 上使用 docker-machine scp失败

在shell里面使用scp拷贝文件,有好多问题

比如:

cker-compose.yml dockervm1:~
ssh: connect to host 127.0.0.1 port 22: Connection refused
lost connection
exit status 1

又有可能会报 You must have a copy of the scp binary locally to use the scp feature

解决方法:使用winscp连接docker machine,传输文件

  1. 打开winscp,运行puttygen
  2. 加载私钥(id_rsa),生成puttykey
  3. 保存生成的ppk (Save private key)
  4. 用Private key 登录 docker machine(user name: docker)

使用docker stack deploy 时遇到image could not be accessed on a registry to record its digest

部署是使用docker stack deploy --with-registry-auth -c docker-compose.yml my-app 或者 使用docker service update --with-registry-auth 更新站点后就成功了

Centos7 使用swarm需要开启的端口

firewall-cmd --zone=public --add-port=2376/tcp --permanent
firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=7946/udp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --reload