Docker 基础

365 阅读5分钟

Docker 是一个开源的应用容器引擎,基于Go开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,不仅仅可以发布到任何流行的 Linux 机器上,也可以在Windows和MAC上安装,也可以实现虚拟化。容器是完全使用沙箱机制。 Docker 从 17.03(2017.03月) 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)

image.png

1.17.0.3 版本以后变更版本发布策略,每个季度会发一个stable版本,每月会发edge版本,社区版本从发版本后维护四个月就会停止对版本的维护。

image.png

image.png

image.png Docker引擎是一个c/s结构的应用 Server(docker daemon):常驻进程 REST API:实现了client和server间的交互协议 CLI:实现容器和镜像的管理,为用户提供统一的操作页面。

image.png

containerd:dockerd实际真实调用的还是containerd的api接口(rpc方式实现),containerd是dockerd和runc之间的一个中间交流组件

docker-shim:是一个真实运行的容器的真实垫片载体,每启动一个容器都会起一个新的shim进程,它直接通过指定的三个参数:容器id,boundle目录,运行时二进制(默认为runc)来调用runc的api创建一个容器。

runc:是一个命令行工具端,他根据oci(开放容器组织)的标准来创建和运行容器。实现了容器启停、资源隔离等功能。Docker默认提供了docker-runc实现,事实上,通过containerd的封装,可以在Docker Daemon启动的时候指定runc的实现。

image.png

1 安装部署

第一步 删除旧的版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
                  
第二步 配置yum源
安装yum工具: yum install -y yum-utils 
下载docker-ce yum源: yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

第三步 执行安装
查看所有版本:yum list docker-ce --showduplicates | sort -r
指定版本安装: yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

systemctl enable docker
systemctl start docker 

第四步 配置镜像仓库
1. Docker安装完成以后,在/etc/docker/目录下执行
cat > daemon.json << EOF
{
   "insecure-registries": [“10.180.210.196"]
}
EOF
systemctl restart docker 重启启动docker时配置生效

2. 登录harbor仓库
   docker login 10.180.210.196 然后根据提示输入用户名:admin,密码:Harbor12345

image.png

2 Docker镜像制作

FROM: 引用基础镜像
            格式:FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] 
            通过公有仓库或私有仓库拉取镜像,platform标识系统架构:linux/amd64, linux/arm64, or windows/amd64。
RUN:执行命令
          两种格式:RUN <command> (/bin/sh -c on Linux or cmd /S /C on Windows)
                           RUN ["executable", "param1", "param2"] (exec form)
          示例:RUN  mkdir /test \
                              touch /test/hello   #多条命令可以使用 \换行连接
ENV:设置环境变量
          两种格式:ENV <key> <value>
                           ENV <key1>=<value1> <key2>=<value2> ...
           示例:ENV myName John 
                     ENV myCat fluffy       或者 ENV myName=John  myCat=fluffy 
EXPOSE: 指定容器运行时监听的端口
            格式:EXPOSE <port> [<port>/<protocol>...] #默认为tcp协议
            示例:EXPOSE 80/tcp  
                      EXPOSE 80/udp
ADD:将文件从本地或URL中添加到镜像文件系统,本地文件必须在上下文(Dockerfile)的当前目录或子目录。
      格式:ADD [--chown=<user>:<group>] <src>... <dest>
                ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
       示例:ADD test.tar.gz /    #自动解压
COPY:和ADD指令功能相似,但缺少两个功能点(不能从URL中添加文件,不能自动解压)

CMD:容器启动命令
        格式:CMD ["executable","param1","param2"] (exec form, this is the preferred form)
                  CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
                  CMD command param1 param2 (shell form)

ENTRYPOINT:容器启动的入口点
         格式:ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
	    ENTRYPOINT command param1 param2 (shell form)                  

3 CMD指令:

The main purpose of a CMD is to provide defaults for an executing container.

CMD在容器运行的时候提供一些命令及参数,用法如下:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)

CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

CMD command param1 param2 (shell form)

第一种用法:运行一个可执行的文件并提供参数。 第二种用法:为ENTRYPOINT指定参数。 第三种用法(shell form):是以”/bin/sh -c”的方法执行的命令。 如你指定:

CMD [“/bin/echo”, “this is a echo test ”] build后运行(假设镜像名为ec):

docker run ec 就会输出: this is a echo test

是不是感觉很像开机启动项 docker run命令如果指定了参数会把CMD里的参数覆盖: (这里说明一下,如:docker run -it ubuntu /bin/bash 命令的参数是指/bin/bash 而非 -it ,-it只是docker 的参数,而不是容器的参数,以下所说参数均如此。)

同样是上面的ec镜像启动:

docker run ec /bin/bash

就不会输出:this is a echo test,因为CMD命令被”/bin/bash”覆盖了。

4 ENTRYPOINT  

字面意思是进入点,而它的功能也恰如其意。

An ENTRYPOINT allows you to configure a container that will run as an executable.它可以让你的容器功能表现得像一个可执行程序一样。

容器功能表现得像一个可执行程序一样,这是什么意思呢?

直接给个例子好说话:

例子一:

使用下面的ENTRYPOINT构造镜像:

ENTRYPOINT ["/bin/echo"] 那么docker build出来的镜像以后的容器功能就像一个/bin/echo程序:

比如我build出来的镜像名称叫imageecho,那么我可以这样用它:

docker run -it imageecho “this is a test” 这里就会输出”this is a test”这串字符,而这个imageecho镜像对应的容器表现出来的功能就像一个echo程序一样。 你添加的参数“this is a test”会添加到ENTRYPOINT后面,就成了这样 /bin/echo “this is a test” 。现在你应该明白进入点的意思了吧。

例子二:

ENTRYPOINT ["/bin/cat"]

构造出来的镜像你可以这样运行(假设名为st):

docker run -it st /etc/fstab 这样相当: /bin/cat /etc/fstab 这个命令的作用。运行之后就输出/etc/fstab里的内容。

5 CMD VS ENTRYPOINT

5.1 CMD

FROM centos
CMD["ps","aux"]

docker run centos:CMDtest
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  4.0  0.0  41812  1520 ?        Rs   12:19   0:00 /usr/bin/ps aux

如果改变参数命令为:-elf
docker run centos:CMDtest -elf
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"-elf\": executable file not found in $PATH": unknown.

必须CMD完全覆盖
docker run centos:CMDtest ps -elf
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 R root         1     0  0  80   0 - 10453 -      12:20 ?        00:00:00 ps -elf

5.2 ENTRYPOINT

FROM centos
ENTRYPOINT ["ps"]
CMD ["aux"]

docker run centos:CMDtest
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  41812  1516 ?        Rs   12:27   0:00 ps aux

如果改变参数命令为:-elf
docker run centos:CMDtest -elf
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 R root         1     0  1  80   0 - 10453 -      12:28 ?        00:00:00 ps -elf

当指定了ENTRYPOINT后,CMD的含义就发生了改变,不再是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令,换句话说实际执行时,将变为:
<ENTRYPOINT> "<CMD>"

ENTRYPOINT指定默认的运行命令, CMD指定默认的运行参数
因为ENTRYPOINT和CMD同时存在时, docker会把CMD的命令拼接到ENTRYPOINT命令之后

image.png

image.png

image.png

6 Docker 命令

docker info 可以查看到docker环境的基本信息
docker ps 查看运行中的容器
   docker ps -l   查看最后一个启动的容器
   docker ps -a 查看所有状态的容器
   docker ps -f status=running(exited/dead/restarting)  根据状态查询
docker images 查看镜像
   docker history image_id 查看镜像的所有层
docker build -t images_name:v1 Dockerfile_dir/.
         docker build -t images_name:v1 -f Dockerfile.centos .
docker exec -it container_id bash   进入容器中
docker logs -f container_id 查看日志
docker rmi -f image_id 删除镜像 
docker rm -f container_id  删除容器
       docker rm -f $(docker ps -a -f status=exited -q)  批量删除状态为退出的容器
docker run -it  image_name:version  (cmd)  前台生成容器
       docker run  -d  -P  --name=test1 image (cmd)  后台生成容器,-P 自动映射端口
docker network ls 查看网络
docker network create my-net      #创建网络
docker run -d --name test --network my-net image (cmd)#启动容器关联my-net网络
docker network connect <container-name>  <other-net>   #连接网络,实现一个容器连接多个网络