docker常用命令

2018-10-15  本文已影响0人  Good灿灿

docker image 相关操作

docker images = docker image ls
docker pull image-name
# docker rmi = docker image rm
docker rmi image-ID
docker build = docker image build
docker build -t create-image-name Dockerfile-path
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
docker ps -aq
docker rm $(docker ps -aq)
docker ps -f "status=exited" -q
docker rm $(docker ps -f "status=exited" -q)
# 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 相关操作

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
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
# 在 Dockerfile 中定义 VOLUME ["/var/lib/mysql"]
# 指定从 mysql 镜像中创建的容器的 volume 在 /var/lib/mysql 中
docker run -v mysql:/var/lib/mysql --name mysql1 mysql

docker exec 相关操作

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

docker exec -it container-ID /bin/bash
docker exec -it container-ID python
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 pull registry
docker run -d -p 5000:5000 --restart always --name registry registry:2
docker pull ubuntu
docker tag ubuntu localhost:5000/ubuntu
docker push localhost:5000/ubuntu

验证方法

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

常用 HTTP API V2 接口

容器物理资源限制

内存 - 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-machine ls
docker-machine create docker-machine-name
docker-machine start docker-machine-name
docker-machine ssh docker-machine-name

-` 删除一个 docker 虚拟机

docker-machine rm docker-machine-name

docker network

docke network ls
docker network inspect docker-network-id/docker-nwtwork-name

bridge 网络

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

# 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 ls
docker volume rm volume-name
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-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 命令行工具

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

docker-compose up
docker-compose up -d

-删除停止的 container

docker-compose down
docker-compose ps
docker-compose up --scale container-name=num
docker-compose build

Swarm mode - 容器编排

初始化

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

docker swarm init --advertise-addr=swarm-manager-ip-addr
docker swarm join --token swarm-manager-join-token swarm-mananger-ip:swarm-manager-port
docker swarm join-token manager 

node 命令

docker node ls

service 命令

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

docker service create --name demo iamge
docker service ls
docker service rm service-name
docker service ps service-name
docker service scale service-name=num

mode - 模式

Routing Mesh 的两种体现

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

# -c == -compose-file
docker stack deploy stack-name --compose-file=docker-compose.yml
docker stack ls
docker stack ps stack-name
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

secret 管理

docker secret create secret-name secret-file
echo "passwod" | docker secret create secret-name -
docker secret ls

使用生成的 secret

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

secrets:
  secret-name:
    file: secret-file-path
上一篇下一篇

猜你喜欢

热点阅读