Docker 是一个开源的应用容器引擎,基于Go开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,不仅仅可以发布到任何流行的 Linux 机器上,也可以在Windows和MAC上安装,也可以实现虚拟化。容器是完全使用沙箱机制。 Docker 从 17.03(2017.03月) 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)
1.17.0.3 版本以后变更版本发布策略,每个季度会发一个stable版本,每月会发edge版本,社区版本从发版本后维护四个月就会停止对版本的维护。
Docker引擎是一个c/s结构的应用 Server(docker daemon):常驻进程 REST API:实现了client和server间的交互协议 CLI:实现容器和镜像的管理,为用户提供统一的操作页面。
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的实现。
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
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命令之后
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> #连接网络,实现一个容器连接多个网络