docker基本命令

一、基本命令:

1、镜像命令

 docker images                                           #查看镜像
 docker search mysql:5.7.0 #搜索镜像
 docker pull [image_name:[latest(默认)/ver]]   #下载镜像
 docker pull ubuntu #默认下载ubuntu:latest
 docker pull centos:7.0.1 #下载带版本的镜像
 docker history centos:7.0.1 #查看本地镜像修改历史
 docker save -o mycentos_7-0-1_image.tar centos:7.0.1 #将镜像打包
 docker load < mycentos_7-0-1_image.tar.gz #导入镜像
 docker import mycentos_7-0-1_image.tar centos:7.0.2 #从归档文件创建镜像
 docker rmi [image_id/image_name] #删除镜像
 docker build [path] #从Dockerfile创建镜像
 docker image tag [image] myubuntu:my_alpine #为镜像设置标签
 docker image prune --force --all #删除末使用的镜像

2、容器命令

 docker ps                                                   #列出当前运行的容器
 docker ps -a #列出所有容器
 docker ps -l #查询最后一次创建的容器
 docker stop [container_id] #停止容器
 docker start [container]
 docker exec -it [container_id] /bin/bash #进入容器
 docker run --restart=always [image] #运行容器
 docker run -i -t -v /var/software:/mnt/software [image] /bin/bash #创建容器
 docker run -rm -it [image] /bin/bash # -rm 停止容器时删除容器
 docker run -d -P --name [name] [image] [alias] [commands] #容器命名
 docker update --restart=always [container_id/container_name]#更新容器参数
 docker logs -f [container_id] #查看容器日志 -f 滚动查看最后f行
 docker container diff [container_id] #查看容器与镜像有什么不同
 #A:新增
 #C:修改过的
 #D:被删除的
 docker container commit [container] [repo[:tag]] # 提交对容器的更改生成镜像
 docker cp [container]:/etc/ngin/nginx.conf /Data/nginx/conf/nginx.conf #拷贝容器数据到宿主机
 docker rm [container_id/container_name] #删除容器
 docker rm -f [container1] [container2] #强制删除容器
 docker rm -v [container] #删除容器并删除挂载的数据卷
 docker inspect [container_id] | grep Mount -A 20 #查看容器数据卷挂载目录
 docker kill -s KILL mynginx #杀掉一个运行中的容器
 yum update && exit #更新并退出容器
 docker commit -m="has update" -a="runoob" [container] runoob/ubuntu:v2 #提交镜像 -m:提交描述信息,-a:镜像作者
 docker export -o ~/python3.tar [container_id] #导出容器文件系统
 cat ~/python3.tar | docker import - python3 #导入文件系统创建镜像
 docker container prune #删除不用的容器
 docker inspect --format='{{.NetworkSetting.IPAddress}}' [container_id] #查看容器IP

3、docker命令

 docker info         #查看docker信息
 docker login --username=qweads registry.cn-hangzhou.aliyuncs.com #登陆远程仓库
 docker logout #退出docker远程仓库
 docker push [image/image_id] #推送镜像到远程仓库
 docker inspect [container_id/image_id] #查看容器或镜像的详细信息
 docker system df #docker磁盘空间使用情况

4、网络命令

 docker network create -d bridge test-net        #-d网络类型 bridge、overlay(swarm)
 docker inspect --format='{{.NetworkSetting.IPAddress}}' [container_id] #查看容器IP
 docker network ls #列出所有网络
 docker network prune #清除所有末被使用到的网络
 docker network inspect test-network #查看网络详细情况
 docker run -itd --name test --network test-net-1 mysql /bin/bash ping #容器连接多个网络
 docker network connect test-net-2 mysql #网络连接容器
 docker network disconnect test-net mysql #网络中移除容器

5、卷命令

 docker volume create shared-data                #手动创建数据卷
 docker volume rm my-data #删除数据卷
 docker volume ls #列出目前已有的卷
 docker volume prune #清除末被使用到的数据卷

修改已启动容器的端口号:

  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、镜像加速

 docker build .              #构建镜像
 tee /etc/docker/daemon.json <<'EOF'
 {
   "registry-mirrors": [
     "https://hub-mirror.c.163.com",
     "https://mirror.baidubce.com",
     "https://hub.docker.com"
  ]
 }
 EOF

2、centos7安装java

 yum install java-1.8.0-openjdk-devel
 touch /etc/profile.d/java.sh
 tee /etc/profile.d/java.sh <<"eof"
 JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk"
 EOF
 source /etc/profile.d/java.sh

 

 FROM        ninrod/springboot           #
 WORKDIR /target
 ADD demo-0.1.1-SNAP.jar demo.jar
 EXPOSE 8080
 ENTRYPOINT ["java","-jar","-c"]
 CMD ["**.jar"]

 

二、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 ["<可执行文件或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 该写法是为 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)。

 

img

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 停止、删除虚拟主机后,再重新创建即可。

posted @ 2021-09-28 15:17  mtgold  阅读(424)  评论(0)    收藏  举报