Docker 是一个开源的应用容器引擎,基于Go开发。Docker 可让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,不单单能够发布到任何流行的 Linux 机器上,也能够在Windows和MAC上安装,也能够实现虚拟化。容器是彻底使用沙箱机制。 Docker 从 17.03(2017.03月) 版本以后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)linux
1.17.0.3 版本之后变动版本发布策略,每一个季度会发一个stable版本,每个月会发edge版本,社区版本从发版本后维护四个月就会中止对版本的维护。docker
Docker引擎是一个c/s结构的应用 Server(docker daemon):常驻进程 REST API:实现了client和server间的交互协议 CLI:实现容器和镜像的管理,为用户提供统一的操做页面。shell
containerd:dockerd实际真实调用的仍是containerd的api接口(rpc方式实现),containerd是dockerd和runc之间的一个中间交流组件json
docker-shim:是一个真实运行的容器的真实垫片载体,每启动一个容器都会起一个新的shim进程,它直接经过指定的三个参数:容器id,boundle目录,运行时二进制(默认为runc)来调用runc的api建立一个容器。ubuntu
runc:是一个命令行工具端,他根据oci(开放容器组织)的标准来建立和运行容器。实现了容器启停、资源隔离等功能。Docker默认提供了docker-runc实现,事实上,经过containerd的封装,能够在Docker Daemon启动的时候指定runc的实现。windows
第一步 删除旧的版本
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
复制代码
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)
复制代码
The main purpose of a CMD is to provide defaults for an executing container.centos
CMD在容器运行的时候提供一些命令及参数,用法以下:api
CMD ["executable","param1","param2"] (exec form, this is the preferred form)bash
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)markdown
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”覆盖了。
字面意思是进入点,而它的功能也恰如其意。
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里的内容。
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
复制代码
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命令以后
复制代码
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> #链接网络,实现一个容器链接多个网络
复制代码