xiaojizhi2023

V1

2023/03/03阅读:16主题:默认主题

dockerCLI

docker CLI

一、docker 基本使用

环境信息与 Repo

export/import 与 save/load 的区别

docker info [option]
docker info --format '{{json .}}'

docker info [option]
docker version --format '{{.Server.Version}}'

镜像管理

# docker image
1. docker image build            # 从Dockfile构建镜像
   docker image build -t image:1.0 -f /root/Dockerfile

2. docker image inspect          # 查看镜像信息

3. docker image save 镜像ID       # 根据镜像 ID 将保存成一个文件
   docker image save -o ubuntu.tar ubuntu
4. docker image load              # 加载镜像
   docker image load -i < ubuntu.tar

5. docker image ls -f dangling=true  # 列出镜像
   docker images
   docker image prune                # 删除所有悬空镜像

6. docker image pull/push      # 拉取/推送镜像
7. docker image rm       # 删除镜像
8. docker image tag       # 为镜像创建标签

容器管理

# docker container

1. docker container attach     # 连接到正在运行中的容器
2. docker container exec      # 在正在运行的容器中执行命令
   docker container exec -it webserver bash
3. docker container run     # 运行命令在新容器中
   docker container run -itd --name Ubuntu ubuntu:16.04 bash
****
4. docker container export     # 将容器的文件系统导出为tar存档, 根据容器 ID 将镜像导出成一个文件
   docker container 1e560fca3906 > ubuntu.tar
6. docker container import     # 从tar导入内容以创建系统镜像

7. docker container inspect    # 显示容器详情
8. docker container logs        # 获取容器的日志
9. docker container prune      # 删除所有停止的容器
10. docker container rm        # 删除容器
   docker rm -f $(docker ps -q -a)

11. docker container start/stop     # 启动/停止容器
12. docker container stats     # 显示容器资源使用情况统计信息的实时流
13. docker container top       # 显示容器的运行过程
14. docker container kill     # 结束一个或多个正在运行的容器

网络与数据持久化

docker_vloumes 参考

  1. bridge 默认模式,相当于 VMware 中的 NAT 模式(VMnet8) --net=bridge

    • 容器使用独立 Network Namespace,并连接到 docker0 虚拟网卡(默认模式);
  2. host 模式,相当于 VMware 中的桥接模式(VMnet0) --net=host

    • 与宿主机在同一个网络中,但没有独立 IP 地址;
  3. none 模式(lo), --net=none

  4. container 模式, --net=container:NAME or ID 指定

    • 不和宿主机共享,新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等;
  5. 补充 VMware 的三种网络模式

    • 1)桥接模式:vmnet0

      • 桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信;
      • 在桥接模式下,虚拟机 ip 地址需要与主机在同一个网段,如果需要联网,则网关与 DNS 需要与主机网卡一致; vmnet0
    • 2)仅主机模式:vmnet1

      • Host-Only 模式其实就是 NAT 模式去除了虚拟 NAT 设备;
      • 使用 VMware Network Adapter VMnet1 虚拟网卡连接 VMnet1 虚拟交换机来与虚拟机通信的,Host-Only 模式将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通讯; vmnet1
    • 3)NAT 模式:vmnet8

      • NAT 模式借助虚拟 NAT 设备和虚拟 DHCP 服务器,使得虚拟机可以联网;
      • 在 NAT 模式下,虚拟机 ip 地址需要与 vmnet8 同一个网段,如果需要联网,则网关与 DNS 需要与 vmnet8 DHCP 范围内; vmnet8
# docker network
1. docker network connect   # Connect a container to a network
2. docker network create     # Create a network
3. docker network disconnect # Disconnect a container from a network
4. docker network inspect   # Display detailed information on one or more networks
5. docker network ls         # List networks
6. docker network prune     # Remove all unused networks
7. docker network rm         # Remove one or more networks

# dokcer volume
1. docker volume create     # Create a volume
2. docker volume inspect     # Display detailed information on one or more volumes
3. docker volume ls         # List volumes
4. docker volume prune       # Remove all unused local volumes
5. docker volume rm         # Remove one or more volumes

1) volumes:Docker管理宿主机文件系统的一部分,/var/lib/docker/volumes(**官方推荐的持久化方案**)
docker run -d -it --name=nginx-test -p 88:80 -v nginx-vol:/usr/share/nginx/html/nginx
docker run -d -it --name=nginx-test -p 88:80 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx

2) bind mounts:可以存储在宿主机系统的任意位置,必须先创建好挂载数据卷,不可移植;
docker run -itd --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx

3) tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(**一般都不会用的方式**);

系统日志

# docker logs
1. docker container run --name test -d busybox sh -c "while true; do $(echo date); sleep 1; done"
2. docker logs -f --until=2s test

dockerfile

  1. 指令
指令 描述 指令 描述
FROM 构建基于的镜像 MAINTAINER 镜像维护者信息
RUN 构建镜像运行的 shell 命令 CMD 运行容器执行的 shell 命令
ARG 构建镜像时指定参数(效果同 ENV),ARG 设置的环境变量仅对 Dockerfile 内有效 ENV 容器内部环境变量
COPY 拷贝文件或目录到镜像,不会自动解压,SRC 只能是本地文件 ADD 拷贝文件或目录到镜像
ENTRYPOINT 运行容器执行的 shell 命令,但其不会被 docker run 的命令行参数指定的指令所覆盖 HEALTHCHECK 健康检查
EXPOSE 容器运行服务端口 WORKDIR 为 RUN/CMD/ENTRYPOINT 设置工作目录
USER 为 RUN/CMD/ENTRYPOINT 执行命令指定用户 VOLUME 指定容器挂载点到宿主机自动生成的目录
ONBUILD 触发指令,以当前镜像构建下一级镜像才会执行 LABEL 给镜像添加元数据,key=value
  1. 几个例子
  • 构建 JAVA
# 运行容器执行的shell命令
# ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

# CMD <shell 命令>
# CMD ["<可执行文件或命令>","<param1>","<param2>",...]
# CMD ["<param1>","<param2>",...]  该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

FROM cnetos:7
MAINTAINER anyue967
ADD jdk-8u45-linux-64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_45          # ENV JAVA_HOME=/usr/local/jdk1.8.0_45
ADD apache-tomcat-8.0.16.tar.gz /usr/local
COPY server.xml /usr/local/apache-tomcat-8.0.46/conf
RUN rm -f /usr/local/*.tar.gz
WORKDIR /usr/local/apache-tomcat-8.0.46
EXPOSE 8080
ENTRYPOINT ["./bin/catalina.sh""run"]
  • 构建 TOMCAT
FROM centos
MAINTAINER anyu967
COPY test.txt /usr/local/container.txt
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local
RUN yum install -y vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
EXPOSED 8080
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh"]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/log/catalina.out
  • 构建 PHP
FROM centos:7
MAINTAINER anyue967
RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel \
    libjpeg-devel libpng-devel openssl-devel

ADD php-5.6.31.tar.gz /tmp/
RUN cd /tmp/php-5.6.31 && \
    ./configure --prefix=/usr/local/php \
    --with-config-file-path=/usr/local/php/etc \
    --with-mysql --with-mysqli \
    --with-openssl --with-zlib --with-curl --with-gd \
    --with-jpeg-dir --with-png-dir --with-iconv \
    --enable-fpm --enable-zip --enable-mbstring && \
    make -j 4 && \
    make install && \
    cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
    sed -i "s/127.0.0.1/0.0.0.0/" /usr/local/php/etc/php-fpm.conf && \
    sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf  # 21行追加 daemonize = no

COPY php.ini /usr/local/php/etc
RUN rm -rf /tmp/php-5.6.31* && yum clean all
WORKDIR /usr/local/php
EXPOSE 9000
CMD ["./sbin/php-fpm""-c""/usr/local/php/etc/php-fpm.conf"]

二、docker 工具(重点介绍 compose)

Docker-Compose

docker-compose bulid

docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
docker-compose up -d  # 在后台启动所有服务
docker-compose stop

docker-compose ps
docker-compose logs
  1. 介绍

    Docker-Compose 项目是 Docker 官方的开源项目,负责实现对 Docker容器集群的快速编排可以轻松、高效的管理容器; Docker-Compose 是一个用于定义和运行多容器 Docker 的应用程序工具,**docker-compose.yml**; Docker-Compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)

  2. docker-composer 安装

    sudo curl -L https://github.com/docker/compose/releases/download/1.23.0-rc3/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  3. 案例

    编写 Dockerfile ,构建⼀个 Docker 镜像(不包含 MySQL 服务端程序),实现:1)镜像中包含⼀个 shell 脚本,容器启动后每隔 30s 收集 MySQL 数据库当前的连接数,将数据同时输出⾄ /data/log ⽂件(⽇志可以持久化保存);2)标准输出中数据库 IP、端⼝、⽤户及密码可以在容器启动时通过 -e 指定环境变量来修改要求;3)容器启动后可以使⽤ docker logs container_namedocker exec -it container_name tail -f /data/log 两种⽅式查看⽇志信息每次输出的信息格式如下 [2019-01-01 00:00:00] Number of active DB connections is 10.

    shell 脚本

    # 收集日志的脚本 conn.sh
    #!/bin/bash
    flag=1
    while [ ${flag} -gt 0 ]; do
            MYSQL_IP=$MYSQL_IP
            MYSQL_PORT=$MYSQL_PORT
            MYSQL_USERNAME=$MYSQL_USERNAME
            MYSQL_PASSWORD=$MYSQL_PASSWORD
            FORMAT=$(date +"%Y-%m-%d %H:%M:%S")
            conn=$(mysql -u${MYSQL_USERNAME} -p${MYSQL_PASSWORD} -h${MYSQL_IP} -P${MYSQL_PORT} -e "show status like 'Threads_running';" |grep "Threads_running" |awk '{print $2}')
            echo "[${FORMAT} Number of active DB connections is ${conn}.]" |tee -a /data/log
            sleep 30
    done

    dockerfile

    FROM centos:7.9.2009
    RUN rm -f /etc/yum.repos.d/*
    ADD mysql-community-client-5.7.31-1.el7.x86_64.rpm /root
    ADD mysql-community-common-5.7.31-1.el7.x86_64.rpm /root
    ADD mysql-community-libs-5.7.31-1.el7.x86_64.rpm /root
    ADD Centos-7.repo /etc/yum.repos.d/
    ADD conn.sh /root/
    RUN yum install -y /root/mysql-community-*.rpm
    ENV MYSQL_IP ""
    ENV MYSQL_PORT ""
    ENV MYSQL_USERNAME ""
    ENV MYSQL_PASSWORD ""
    RUN chmod +x /root/conn.sh
    ENTRYPOINT ["/root/conn.sh"]

    编写 Docker-compose 编写 docker-compose.yml 脚本,使⽤ Dockerfile 中构建的镜像及 MySQL 镜像启动服务

     # 配置文件.env
     # compose ⇒ (mysql & conn)
     # **工程(project),服务(service)以及容器(container)**

     # .env
     MYSQL_IP=Your's host IP
     MYSQL_PORT=Your's db port
     MYSQL_USERNAME=Your's db username
     MYSQL_PASSWORD=Your's db password

     version: '3'
     services:
       mysql:
         container_name: mysql
         image: mysql:5.6.38
         restart: always
         ports:
           - 3306:3306
         environment:
           - MYSQL_ROOT_PASSWORD=Your's password
       conn:
         container_name: conn
         build:
           context: .
           dockerfile: Dockerfile
         restart: always
         environment:
           MYSQL_IP: "${MYSQL_IP}"
           MYSQL_PORT: "${MYSQL_PORT}"
           MYSQL_USERNAME: "${MYSQL_USERNAME}"
           MYSQL_PASSWORD: "${MYSQL_PASSWORD}"
         volumes:
           - /data:/data

Docker Machine

  1. 介绍

    负责在多种平台上快速安装 Docker 环境;

Docker-swarm

  1. 介绍

    提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案, 用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台;

分类:

后端

标签:

云计算

作者介绍

xiaojizhi2023
V1