docker命令大全

一、基本命令:
查看镜像:docker images
搜索镜像:docker search mysql:5.7.0 (5.7.0:搜索指定的版本)
列出当前运行的容器:docker ps
列出所有的容器(包括已停止的):docker ps -a
停止容器 :docker stop 5d034c6ea010 (5d034c6ea010 : 容器id)
进入容器: docker exec -it 容器id /bin/bash
下载镜像:docker pull ubuntu(默认latest,最新版)
下载带版本的镜像:docker pull ubuntu:13.10
创建容器时,设置自动启动容器:docker run --restart=always 容器id(或者容器名称)
如果创建时未指定 --restart=always ,可通过update 命令设置:
docker update --restart=always 容器id(或者容器名称)
查看docker信息:docker info
查看容器的日志:docker logs -f 容器ID(-f:可以滚动查看日志的最后几行)
查看我们的容器与基础镜像有什么不同:docker container diff sample
A代表新增文件
C代表修改过的文件
D代表被删除的文件
将修改过的容器导出为自己的镜像:docker container commit sample my-alpine
看本地镜像runoob/ubuntu:v3的创建历史:docker history runoob/ubuntu:v3
将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档:
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3(-o :输出到的文件)
导入使用 docker save 命令导出的镜像:
docker load < busybox.tar.gz
从镜像归档文件my_ubuntu_v3.tar创建镜像,命名为runoob/ubuntu:v4:
docker import my_ubuntu_v3.tar runoob/ubuntu:v4
创建容器:docker run -i -t -v /root/software/:/mnt/software/ 9f38484d220f /bin/bash (-v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>)
运行容器:docker run --rm -t -i ubuntu:15.10 /bin/bash (/bin/bash:交互式 Shell,-t: 表示容器启动后会进入其命令行,-i: 表示以“交互模式”运行容器,
--rm:停止容器后直接删除容器)
数据拷贝: docker cp,此命令用于容器与宿主机之间进行数据拷贝,如 docker cp 5d034c6ea010: /etc/nginx/nginx.conf /dockerData/nginx/conf/nginx.conf 将容器的目录文件拷贝到宿主机指定位置,容器ID可以替换成容器名
删除镜像:docker rmi 镜像名/镜像id
删除容器: docker rm 容器id (必须是未启动的容器 )
强制删除容器 db01、db02:docker rm -f db01 db02
删除容器 nginx01, 并删除容器挂载的数据卷:docker rm -v nginx01
移除所有的容器:docker rm -f (docker container ls -aq) 杀掉一个运行中的容器:docker kill -s KILL mynginx(-s :向容器发送一个信号) 更新镜像: 1.从已经创建的容器中更新镜像,并且提交这个镜像,使用 yum update 更新镜像,在完成操作之后,输入 exit 命令来退出这个容器。 提交镜像: docker commit -m= /地址/容器别名.tar, 导入容器:cat docker/ubuntu.tar | docker import - test/ubuntu:v1 (将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1) 查看镜像或容器的详细信息:docker inspect 容器id (可以加-f参数只查看某一项信息) 查看容器IP: docker inspect --format='{{.NetworkSettings.IPAddress}}'">CONTAINER_ID/NAME
查看容器数据卷挂载目录:docker inspect container_id | grep Mounts -A 20
手动创建数据卷: docker volume create shared-data
删除数据卷: docker volume rm my-data
列出目前已有的volume:docker volume ls
与磁盘空间使用情况相关的命令:docker system df
移除所有不在运行状态的容器:docker container prune
清除未被使用到的镜像:docker image prune --force --all
清除未被使用到的数据卷:docker volume prune
创建一个自定的网络:docker network create --driver bridge sample-net
查看所有网络 :docker network ls
删除所有未被任何容器或者服务连接的网络:docker network prune
查看该网络的详细情况:docker network inspect test-network
将一个容器连接到多个网络:
第一步:docker run -itd --name test --network test-net mysql /bin/bash ping
127.0.0.1
第二步:docker network connect test-net mysql
从网络中移除容器:docker network disconnect 网络名/id mysql
删除网络:docker network rm my-network1(删除前,必须确认没有容器在使用该网络)
修改已启动容器的端口号:

  1. docker ps 查看 Container 的 id
  2. docker stop {container_id}
    3.找到 /var/lib/docker/containers/{container_id}/hostconfig.json 修改
  3. sudo service docker restart 重启docker
  4. docker start {container_id} 重新启动 container

二、dockerfile:
1、创建Dockerfile文件:mkdir Dockerfile
2、编辑文件 :vi Dockerfile
3、添加脚本如:
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
介绍:
FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:RUN <命令行命令>,<命令行命令> 等同于,在终端操作的 shell命令。
exec 格式:RUN ["可执行文件", "参数1", "参数2"]
例如:#RUN ["./test.php", "dev", "offline"] 等价于RUN ./test.php dev offline

指令详解
1》COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径:
COPY . /app #将上下文目录中所有文件或目录递归拷贝到容器的/app目录下
COPY ./web /app/web #将上下文目录中的web目录下的内容拷贝到容器的/app/web目录下
COPY sample.txt /data/my-sample.txt #拷贝单个文件并重命名
ADD sample.tar /app/bin/ #解压tar包内的文件到指定目录
ADD http://example.com/sample.txt /data/ #拷贝远程文件到指定目录
COPY ./sample* /mydir/ #支持源路径中使用通配符
2》WORKDIR
WORKDIR用来定义工作目录或者上下文目录。常见的问题:
(WORKDIR 指定的工作目录,必须是提前创建好的)。
由于每执行一次RUN,都是在原有镜像上添加一个新层,因此上面的命令只是在root目录下新建了sample.txt文件。
正确的切换至一个目录下,并新建文件,命令如下:
WORKDIR /app/bin
RUN touch sample.txt
3》CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
CMD ["<可执行文件或命令>","","",...]
CMD ["","",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
4》ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。
假设已通过 Dockerfile 构建了 nginx:test 镜像:
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
1、不传参运行
docker run nginx:test
容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/nginx.conf
2、传参运行
docker run nginx:test -c /etc/nginx/new.conf
容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
nginx -c /etc/nginx/new.conf
Dockerfile构建镜像命令:docker build -t nginx:test . (. 代表Dockerfile文件的路径)
当你的配置文件不是默认的名字时,可以使用-f参数指定:

  docker build -t nginx:test -f my-Dockerfile .

三、docker-compose:
docker-compose.yml 配置文件:
# yaml 配置
version: '3'
services:
webapp:
build: ./dir
ports:
- "5000:5000"
redis:
image: "redis:alpine"
介绍:
docker-compose命令需在docker-compose.yml 所在目录下才能运行
启动应用程序:docker-compose up -d (-d:在后台启动)
指定使用的 Compose 模板文件,默认为 docker-compose.yml:
docker-compose -f docker-compose.yml up -d
停用移除所有容器以及网络相关:docker-compose down
docker-compose logs:docker-compose logs
列出所有容器:docker-compose ps
构建(重新构建)项目中的服务容器:docker-compose build
拉取服务依赖的镜像:docker-compose pull
列出指定服务的容器:docker-compose ps eureka
删除指定服务的容器:docker-compose rm eureka
启动指定服务已存在的容器:docker-compose start eureka
在一个服务上执行一个命令:docker-compose run web bash(这样即可启动一个web服务,同时执行bash命令)
停止已运行的容器:docker-compose stop eureka
通过发送SIGKILL 信号停止指定服务的容器:docker-compose kill eureka
一个web服务形成瓶颈的时候,我们可以快速地的扩充几个web服务出来 :
docker-compose up --scale web=3(ports:需要修改为随即映射端口,如 -5000)
version:指定本 yml 依从的 compose 哪个版本制定的。
build:指定为从上下文路径 ./dir/Dockerfile 所构建的镜像,
或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
target: prod
context:上下文路径。
dockerfile:指定构建镜像的 Dockerfile 文件名。
args:添加构建参数,这是只能在构建过程中访问的环境变量。
labels:设置构建镜像的标签。
target:多层构建,可以指定构建哪一层。

depends_on 设置依赖关系:
docker-compose up :以依赖性顺序启动服务
docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
docker-compose stop :按依赖关系顺序停止服务。
docker-compose.yml:
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意:web 服务不会等待 redis db 完全启动 之后才启动。

deploy:指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。
docker-compose.yml:
version: "3.7"
services:
redis:
image: redis:alpine
deploy:
mode:replicated
replicas: 6
endpoint_mode: dnsrr
labels:
description: "This redis service label"
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s

endpoint_mode:访问集群服务的方式:
vip:集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
dnsrr:DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。
labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。
mode:指定服务提供的模式:
replicated:复制服务,复制指定服务到集群的机器上
global:全局服务,服务将部署至集群的每个节点。
replicas:mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。
resources:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。
restart_policy:配置如何在退出容器时重新启动容器。
condition:可选 none,on-failure 或者 any(默认值:any)。
delay:设置多久之后重启(默认值:0)。
max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默 认值:一直重试)。
window:设置容器重启超时时间(默认值:0)。

四、docker-machine:
列出可用的机器:docker-machine ls
创建一台名为 test 的机器:docker-machine create --driver virtualbox test(--driver:指定用来创建机器的驱动类型。)
查看机器的 ip:docker-machine ip test
停止机器: docker-machine stop test
启动机器:docker-machine start test
进入机器:docker-machine ssh test
查看当前激活状态的 Docker 主机:docker-machine active
查看某一个docker vm主机的信息:docker-machine env test
删除某台 Docker 主机,对应的虚拟机也会被删除::docker-machine rm test
以 json 格式输出指定Docker的详细信息:docker-machine inspect test
设置当前的环境变量为某一个主机的信息:eval (docker-machine env -u)
通过 SSH 连接到主机上,执行命令:docker-machine ssh swarm-manager

五、docker swarm:
Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。
swarm 集群由管理节点(manager)和工作节点(work node)构成。
swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。
work node:即图中的 available node,主要负责运行相应的服务来执行任务(task)。


image.png

1、创建 swarm 集群管理节点(manager)
创建 docker 机器: docker-machine create -d virtualbox swarm-manager
连接到主机上:docker-machine ssh swarm-manager
初始化 swarm 集群,进行初始化的这台机器,就是集群的管理节点:
docker swarm init --advertise-addr 192.168.99.107 #这里的 IP 为创建机器时分配的 ip。
会输出:
docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh3j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:2377
查看集群节点信息: docker node ls
2、创建 swarm 集群工作节点(worker)
使用docker-machine 创建swarm-worker1 和 swarm-worker2 两台机器。
docker-machine create -d virtualbox worker1
docker-machine create -d virtualbox worker2
docker-machine ssh swarm-worker1进入机器里
添加上一步输出的内容。
3、查看集群信息
docker-machine ssh swarm-manager进入集群管理节点,执行docker info 可以查看当前集群的信息(Swarm:active,Managers:1,Nodes:3,有三个节点,其中有一个是管理节点)
4、部署服务到集群中
注意:跟集群管理有关的任何操作,都是在管理节点上操作的。
在一个工作节点上创建一个名为 helloworld 的服务,这里是随机指派给一个工作节点:docker service create --replicas 1 --name helloworld alpine ping docker.com
命令解释:
docker service create 命令创建一个服务
--name 服务名称命名为 helloworld
--replicas 设置启动的示例数
alpine指的是使用的镜像名称,ping docker.com指的是容器运行的bash
5、查看服务部署情况
查看 helloworld 服务运行在哪个节点上,可以看到目前是在 swarm-worker1 节点: docker service ps helloworld
查看 helloworld 部署的具体信息:docker service inspect --pretty helloworld
6、扩展集群服务
将上述的 helloworld 服务扩展到俩个节点:docker service scale helloworld=2
可以看到已经从一个节点,扩展到两个节点:docker service ps helloworld
7、删除服务:docker service rm helloworld
查看是否已删除:docker service ps helloworld
8、滚动升级服务
介绍 redis 版本如何滚动升级至更高版本
创建一个 3.0.6 版本的 redis。
docker service create --replicas 1 --name redis --update-delay 10s redis:3.0.6
滚动升级 redis
docker service update --image redis:3.0.7 redis
9、停止某个节点接收新的任务
查看所有的节点:docker node ls
可以看到目前所有的节点都是 Active, 可以接收新的任务分配。
停止节点 swarm-worker1:
docker node update --availability drain swarm-worker1 (Drain:节点状态)
重新激活swarm-worker1:
docker node update --availability active swarm-worker1(active :活跃状态)
10.退出 Swarm 集群
如果 Manager 想要退出 Swarm 集群, 在 Manager Node 上执行如下命令:
docker swarm leave
就可以退出集群,如果集群中还存在其它的 Worker Node,还希望 Manager 退出集群,则加上一个强制选项,命令行如下所示:docker swarm leave --force
在 Worker2 上进行退出测试,登录 worker2 节点:
docker-machine ssh worker2
执行退出命令:docker swarm leave
11.重新搭建命令
使用 VirtualBox 做测试的时候,如果想重复实验可以将实验节点删掉再重来。
停止虚拟机:docker-machine stop manager1 worker1 worker2
移除虚拟机:docker-machine rm manager1 worker1 worker2
停止、删除虚拟主机后,再重新创建即可。

你可能感兴趣的:(docker命令大全)