docker常用命令

docker image 相关操作

  • 显示所有 image
docker images = docker image ls
  • 拉去 registry 中的已有 image
docker pull image-name
  • 删除 image
# docker rmi = docker image rm
docker rmi image-ID
  • 根据一个 Dockerfile 构建一个 image (推荐使用该方式来创建,方便分享给他人使用)
docker build = docker image build
  • 制定文件 Dockerfile 创建 image
docker build -t create-image-name Dockerfile-path
  • 查看 image 的创建历史
docker history image-ID

docker container 相关操作

  • 显示所有正在运行的容器
docker ps = docker container ls
  • 显示所有容器(包括推出的容器)
docker ps -a
  • 停止运行的容器
# docker stop = docker container stop
docker stop container-ID/container-name
  • 单个单个删除容器 - 容器必须是退出状态
# docker rm = docker container rm
docker rm container-ID/container-name
  • 显示所有容器的 ID,'-q' 只显示容器 ID 号
docker ps -aq
  • 删除多个容器
docker rm $(docker ps -aq)
  • 显示已经退出的容器 ID
docker ps -f "status=exited" -q
  • 删除已经退出的容器
docker rm $(docker ps -f "status=exited" -q)
  • 根据一个 container 的修改创建新的 image (不推荐使用该方式,建议使用 Dockerfile 的形式)
# docker commit = docker container commit
docker commit old-container-namae new-image-name
  • 查看容器详细信息
# docker inspect = docker contaienr inspect
docker inspect container-ID
  • 查看容器运行时产生的日志
# docker logs = docker container logs
docker logs container-ID

docker run 相关操作

  • 交互式运行一个 image
docker run -it image-name
  • 后台执行
docker run -d image-name
  • 定义名字运行容器
# 定义名字的容器是唯一的
docker run -d --name=demo image-name
docker stop demo
docekr rm demo
docker start demo
  • 类似网络 NDS ,通过名称连接容器之间的网络
docker run -d --name test1 image-name
dokcer run -d --name test2 --link test1 image-name

# 在 test2 容器中可以直接使用容器 test1 来访问网络
docker exec -it test2 ping test1
  • 启动时指明使用的网络
# 新的网络可以通过 docker network create 来创建
docker run --network network-name image-name
  • 端口映射
# 将容器的 80 端口映射到 docker 主机的 80 端口
docker run -p 80:80 image-name
  • 设置环境变量
# 设置 demo 的环境 REDIS_HOST 的值为 redis 容器的 IP 地址
docker run --name demo --link redis -e REDIS_HOST=redis image-name
  • 指定 volume
# 在 Dockerfile 中定义 VOLUME ["/var/lib/mysql"]
# 指定从 mysql 镜像中创建的容器的 volume 在 /var/lib/mysql 中
docker run -v mysql:/var/lib/mysql --name mysql1 mysql

docker exec 相关操作

可以进入在运行中或停止运行的容器中操作相关的命令

  • 交互式进入后执行 /bin/bash 进行命令操作
docker exec -it container-ID /bin/bash
  • 交互式进入后执行 python 进入 python 解释器
docker exec -it container-ID python
  • 交互式进入后执行 ip a 查看运行中的容器 IP 地址
docker exec -it container-ID ip a

Dockerfile 语法

FROM

尽量使用官方的 image 作为 base image (比较安全)

# 制作 base image
FROM scratch 

# 使用 base image 
FROM centos 
FROM UBUNTU:14.04

LABEL

Metadata 不可少

LABEL maintainer="caojiacan0618@gmail.com"
LABEL version="1.0"
LABEL description="This is description"

RUN

为了美观,复杂的RUN请用反斜线换行
避免无用分层,合并多条命令成一行

# 反斜线换行
RUN yum update && yum install -y vim \
    python-dev

# 注意清理 cache
RUN apt-get update && apt-get install -y perl \
    pwgen --no-install-recommends && rm -rf \
    /var/lib/apt/lists/*

RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'

WORKDIR

作用类似 cd 命令
用 WORKDIR,不要使用 RUN cd
尽量使用绝对目录

WORKDIR /root

# 如果没有会自动创建 test 目录
# 以下三行将会输出 /test/demo
WORKDIR /test
WORKDIR demo
RUN pwd

ADD and COPY

大部分情况,COPY 优于 ADD
ADD 除了 COPY 还有额外的功能(解压)
添加远程文件/目录请使用 curl 或者 wget

# 将当前目录的 hello 文件添加到 image 的根目录下
ADD hello /

# 添加到根目录,ADD 会执行解压缩, COPY 不会执行解压缩
ADD test.tar.get /

# 讲当前目录的 hello 文件,添加到 /root/test/ 目录下
# 生成的容器中会存在一个 /root/test/hello 文件
WORKDIR /root
ADD hello test/

# 以下效果同上
WORKDIR /root
COPY hello test/

ENV

尽量使用 ENV 增加可维护性

# 设置常量 MYSQL_VERSION 为 5.6 
ENV MYSQL_VERSION 5.6 

# 引用常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \
    && rm -rf /var/lib/apt/lists/*

CMD and ENTRYPOINT

RUN:执行命令并创建新的 Image Layer
CMD:设置容器启动后默认执行的命令和参数
ENTRYPOINT:设置容器启动时运行的命令

# 以下通过 docker run [image] 输出 hello $name 并不是想要结果
FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"

# 以下通过 docker run [image] 输出 hello Docker 正是想要的结果
FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]

# cmd 补充说明
# 容器启动时默认执行的命令
# 如果 docker run 制定了其他命令,CMD 命令被忽略
# 如果定义多个 CMD,只有最后一个会执行
# 以下通过 docker run [image] 输出 hello Docker 正是想要的结果
FROM centos
ENV name Docker
CMD echo "hello $name"

# entrypoint 补充说明
# 让容器以应用程序或者服务的形式运行
# 不会被忽略,一定执行
# 最佳实践:写一个 shell 脚本作为 entrypoint
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 27017
CMD ["mongod"]

# CMD 和 ENTRYPOINT 结合使用
ENTRYPOINT ["/usr/bin/ls"]
CMD []
# 创建一个以上两个语句组成的 image 后执行
docker run iamge --> 输出当前目录文件
docker run iamge -a --> 输出当前目录所有文件

EXPOSE

# 使容器对外暴露 5000 端口
EXPOSE 5000

创建私有 Docker Hub

使用 Docker Registry

基本使用方法

  • 从 Docker Hub 拉取官方 registry image
docker pull registry
  • 启动一个 registry container
docker run -d -p 5000:5000 --restart always --name registry registry:2
  • 从 Docker Hub 拉取一个 ubuntu image
docker pull ubuntu
  • 修改 ubuntu repository 名称为私有 Docker Hub 启动的主机 IP + PORT + / + name
docker tag ubuntu localhost:5000/ubuntu
  • 推送 image 到私有 Docker Hub 上
docker push localhost:5000/ubuntu

验证方法

# 删除 localhost:5000/ubuntu 镜像
docker rmi localhost:5000/ubuntu
# 重新从私有 Docker Hub 上拉取
docker pull localhost:5000/ubuntu

常用 HTTP API V2 接口

  • GET /v2/_catalogu 显示已有 image

容器物理资源限制

内存 - Memory

只设置 memory 那么 memory-swap 默认等于 memory,即占用两倍设置的 memory

# 设置 memory 200M 和 memory-swap 200M 一共最多可使用 400M 内存
# docker run --memory=200M = docker run -m 200M
docker run --memory=200M image-name

CPU

--cpu-shares 并不是设置 CPU 个数,而是设置相对权重
CPU 个数多的容器会优先去使用资源的 CPU
在主机 CPU 跑满时,会根据设置的 CPU 个数呈现一个百分比关系

# docker run --cpu-shares=5 = docker run -c 5
docker run --cpu-shares=5 image-name

docker-machine 操作

  • 列出所有 docker 虚拟机
docker-machine ls
  • 创建一个 docker 虚拟机
docker-machine create docker-machine-name
  • 启动一个 docker 虚拟机
docker-machine start docker-machine-name
  • 登录一个 docker 虚拟机
docker-machine ssh docker-machine-name

-` 删除一个 docker 虚拟机

docker-machine rm docker-machine-name

docker network

  • 显示本机所有的 docker 网络
docke network ls
  • 显示使用对应 docker 网络的容器
docker network inspect docker-network-id/docker-nwtwork-name

bridge 网络

连接到自己创建的 bridge 网络中的容器,默认已经相互 link,可以直接使用容器名称来访问

  • 创建一个 docker birdge 网咯
# docker network create -d 驱动名称 新的网络名称
docker  network create -d bridage my-bridage
  • 将容器连接到指定的网络
docker network connect network-name container-name

none 网络

安全性高

# 谁都不能访问的容器
docker run --network none image-name

host 网络

容器出现端口冲突

# 和主机共享一套网络
docker run --network host image-name

overlay 网络 - 实现多机通信

该网络基于 VXLAN 方式实现类似隧道的功能
使用 overlay 网络加分布式存储 etcd 实现

持久化存储和数据共享

持久化数据的方案

基于本地文件系统的 volume

受管理的 data volume,由 docker 后台自动创建
绑定挂载的 volume,具体挂载位置可以由用户指定

可以在执行 Docker create 或 Docker run 时,通过 -v 参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文系统的 volume 管理

  • 查看所有 docker 管理的 volume
docker volume ls
  • 删除一个 volume
docker volume rm volume-name
  • 查看 volume 详细信息
docker volume inspect volume-name
data volume 方式

需要在 Dockerfile 中定义好存储的目录

# 在 Dockerfile 中定义 VOLUME ["/var/lib/mysql"]
# 指定从 mysql 镜像中创建的容器的 volume 在 /var/lib/mysql 中
docker run -v mysql:/var/lib/mysql --name mysql1 mysql
Bind Mouting 方式

不需要在 Dockerfile 中定义
目录映射的关系
Centos 7 下 使用 chcon -Rt httpd_sys_content_t . 关闭文本安全
或者使用 docker run --privileged=true 加特权

# 定义主机目录和容器目录
# -v 主机目录:容器目录
docker run -v /home/aaa:/root/aaa image-name

基于 plugin 的 volume

支持第三方的存储方案,比如 NAS,aws

docker-compose 相关操作 - 默认识别 docker-compose.yml 文件名

  • Docker Compose 是一个工具
  • 这个工具可以通过一个 yml 文件定义多容器的 docker 应用
  • 通过一条命令就可以根据 yml 文件的定义去创建或者管理这个多容器

docker-compse.yml 文件语法

Services

一个 services 代表一个 container,这个 container 可以从 dockerhub 的 image 来创建,或者从本地的 Dockerfile build 出来的 image 来创建
Service 的启动类似 container run,我们可以给其指定 network 和 volume,所以可以给 service 指定 network 和 volume 的应用

# 以下作用和 docker run -d --network back-tier -v db-data:/var/lib/postgresql/data/ postgres:9.4 命令相同
services:
  db:
    image: postgres:9.4
    volumes:
      - "db-data:/var/lib/postgresql/data"
    networks:
      - back-tier

# 以下作用是从 ./worker 目录中的 Dockerfile 文件创建的 image 连接 db 和 reids 并连接在 back-tier 网络中
services:
  worker:
    build: ./worker
    links:
      - db
      - redis
    networks:
      - back-tier

Networks

# 以下作用和 docker network create -d bridge front-tier && docker network create -d bridge back-tier 命令相同
networks:
  front-tier:
    driver: bridge
  back-tier:
    driver: bridge

Volumes

# 以下作用和 docker volume create db-data 命令相同
volumes:
  db-data:

完整的例子

version: '3'

services:

  wordpress:
    image: wordpress
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root

    # 依赖配置,指明先启动依赖的容器
    depends_on:
      - mysql

    networks:
      - my-bridge

  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - my-bridge

volumes:
  mysql-data:

networks:
  my-bridge:
    driver: bridge

docker-compose 命令行工具

用于本地开发,不适用于生产环境

  • 前台启动 container
docker-compose up
  • 后台启动 container
docker-compose up -d

-删除停止的 container

docker-compose down
  • 查看运行的 docker compose
docker-compose ps
  • 指定启动容器的个数
docker-compose up --scale container-name=num
  • 预构建 Dockerfile
docker-compose build

Swarm mode - 容器编排

  • 管理更多容器
  • 方便横向扩展
  • 容器 down 了自动恢复
  • 更新容器而不影响业务
  • 监控追踪容器
  • 调度容器的创建
  • 保护隐私数据

初始化

先初始化 manager 节点
worker 节点使用生成的 token 进行添加

  • 进入 manager 节点创建 swarm manager
docker swarm init --advertise-addr=swarm-manager-ip-addr
  • 进入 worker 节点加入 swarm manager
docker swarm join --token swarm-manager-join-token swarm-mananger-ip:swarm-manager-port
  • 在 manager 节点管理 join token
docker swarm join-token manager 

node 命令

  • 显示当前 swarm 节点
docker node ls

service 命令

在 swarm 模式下一般不用 run 而使用 service

  • 创建一个 service,及运行一个 container 并运行
docker service create --name demo iamge
  • 查看 service
docker service ls
  • 删除 service
docker service rm service-name
  • 查看具体 service 内容
docker service ps service-name
  • 扩展 service
docker service scale service-name=num

mode - 模式

  • replicated 可以可以横向扩展
  • global 不能做横向扩展

Routing Mesh 的两种体现

  • Internal - Container 和 Container 之间的访问通过 overlay 网络 (通过 VIP 虚拟 IP)
  • Ingress - 如果服务有绑定端口,则此服务可以通过任意 swarm 节点的相应接口访问

docker-compose.yml 中配置 deploy

官方文档
网络默认使用 overlay

deploy:

  # 定义模式为 replicated 可以横行扩展
  mode: replicated

  # 定义横向扩展 3 个容器
  replicas: 3
    
  # 配置运行位置
  placement:
    # 指定容器运行的节点
    constraints:
      - node.role == manager 

  # 配置重启方案
  restart_policy:
    # 条件
    condition: on-failure
    # 延迟
    delay: 5s
    # 最大尝试次数
    max_attempts: 3

  # 更新配置
  update_config:
    # 同时更新个数
    parallelism: 2
    # 延迟
    delay: 10s
    # 顺序
    order: stop-first

docker stack 部署 docker-compose.yml

stack 一次性启动多个 service

  • 启动stack
# -c == -compose-file
docker stack deploy stack-name --compose-file=docker-compose.yml
  • 查看所有 stack
docker stack ls
  • 查看具体的 stack 运行详情
docker stack ps stack-name
  • 查看概括的 service 运行情况
docker stack service stack-name

update service

单个 service 更新步骤

docker service create -d --name server -p 8080:5000 image-name:1.0

# 使用 scale 扩展
docker service scale server=2

# 更新 service 版本
dockeer service update --image image-name:2.0 server

# 更新 service 端口
dockeer service update --publish-rm 8080:5000 --publish-add 8888:5000 server

可视化工具

services:
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

docker Secret Management

  • 存在 Swarm Manager 节点 Raft database 里
  • Secret可以 assign 给一个 service,这个 service 就能看到这个 secret
  • 在 container 内部 Secret 看起来像文件,但是实际是在内存中

secret 管理

  • 创建 secret - 文件方式
docker secret create secret-name secret-file
  • 创建 secret - 命令行 echo 方式
echo "passwod" | docker secret create secret-name -
  • 查看 secret - 源文件删除了也可以查看到
docker secret ls

使用生成的 secret

  • 创建 service 时指明 sercet
# 在容器中 /run/secrets/ 中存放传入的 secret
docker service create --secret secret-name iamge-name
  • 在 docker-compose.yml 文件中使用
# 前提是已经创建了 secret
services:
  app:
    image: xxx
    secrets:
      - secret-name
    environment:
      SECRET_DEMO:/run/secrets/secret-name
  • 在 docker-compose.yml 文件中创建和使用
# 不太推荐使用,相对上面一种安全性较低
services:
  app:
    image: xxx
    secrets:
      - secret-name
    environment:
      SECRET_DEMO:/run/secrets/secret-name

secrets:
  secret-name:
    file: secret-file-path
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 一、docker常用命令 docker容器生命周期管理 docker run 在一个新的容器执行一个命令 dock...
    淹死的鱼_hz阅读 9,826评论 0 5
  • docker常用命令详解 - CSDN博客 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的...
    Meathill大魔王阅读 795评论 1 2
  • Docker基础 这篇基础文章是方便用户在使用cSphere平台之前,了解docker基础知识。 针对已经有一定的...
    4ea0af17fd67阅读 457评论 0 0
  • 在我这年过半五十的人生里有位美人,承蒙她的体贴照顾生活的无忧无虑,天地之间想做的事情都能去做,虽没说享尽世间万物但...
    阿房少侠阅读 191评论 0 0
  • 【献给我的爸妈,和曾走近我的朋友。】 1 离家前的12个小时,我在黑夜中意外失眠了。床铺和往常一样没有换新,我...
    Monva11阅读 974评论 5 10