- 由 虚拟的现实创建于10月 13, 2023 需要 5 分钟阅读时间
Docker 系统架构
Docker daemon:守护进程。通过 docker daemon 命令启动,它负责容器的创建、运行和监控,还负责镜像的构建和储存。
Clinet:客户端。通过 HTTP 和 Docker 守护进程通信。
Registry:寄存服务。负责存储和发布镜像。
底层技术
cgroups,负责管理容器使用的资源(例如 CPU 和内存的使用)。
namespace,负责容器之间的隔离,确保系统的其他部分与容器的文件系统、主机名、用户、网络和进程都是分开的。
周边技术
网络连接,通过 Docker 的联网插件结构,用户可以用其他方案取代 Overlay 驱动程序。
服务发现,解决方案包括 Consul、SkyDNS。
服务编排和群集管理, Kubernets。
Dockerfile 指令
ADD,从构建环境的上下文或远程 URL 复制文件到镜像。添加本地归档文件会自动解压。一般使用相对简单的 COPY 指令复制构建文件和目录。
CMD,当容器启动时执行指定的指令。如果定义了 ENTRYPOINT ,该指令将被解释为 ENTRYPOINT 的参数(确保使用 exec 格式)。
COPY,复制文件到镜像。它有2中方式,COPY src dest 以及 COPY [ "src","dest" ],如果路径中有空格,必须使用 JSON 数组的格式。
ENTRYPOINT,设置一个于容器启动时运行的可执行文件。
ENV,设置镜像内的环境变量,这些变量可以被随后的指令引用。
EXPOSE,向 Docker 表示该容器将会有一个进程监听所指定的端口。
FROM,设置 Dockerfile 使用的基础镜像,随后的指令皆执行于这个镜像上。
MAINTAINER,镜像作者的元数据。
ONBUILD,指定当镜像被用作另一个镜像的基础镜像时将会执行的指令。
RUN,在容器执行指定的指令,并把结果保存下来。
USER,设置任何后续的 RUN、CMD 或 ENTRYPOINT 指令执行时所用的用户。
VOLUME,指定为数据卷的文件或目录。如果该文件或目录已经在镜像中存在,当容器启动时,它会被复制到这个卷;如果提供了多个参数,会被解释成多个数据卷。
WORKDIR,对任何后续的 RUN、CMD、ENTRYPOINT、ADD 或 COPY 指令设置工作目录。
容器互联
其中 -p 8000:80 将主机的 8000 端口转发到容器的 80 端口。或者可以使用 -P 选项让 Docker 自动选择一个主机上未使用的端口。
docker run -d -p 8000:80 nginx ID=$(docker run -d -P nginx) docker port $ID 80
容器间的连接主机网络无法看见。连接的初始化通过 docker run 传入 --link CONTAINER:alias 参数,其中 CONTAINER 是目标容器的名称,而 alias 是主容器用来称呼目标容器的一个本地名称。
使用 Docker 的连接也会把目标容器的别名和 ID 添加到主容器的 /etc/hosts,允许主容器通过名称找到目标容器。
docker run -d --name myredis redis docker run --link myredis:redis debian env
默认情况下,无论是否已经建立了 显式连接,容器之间可以相互通信。如果想要防止尚未连接的容器能够互联,可以在启动 Docker 守护进程式加上 --icc=false 和 --iptables。
常用的容器指令
存储相关
docker system df docker system prune docker system prune -a docker image ls -a docker image rm <name_or_id> docker container ls -a docker container stop <name_or_id> docker container rm <name_or_id>
网络相关
docker network ls docker network rm <name_or_id>
执行相关
docker volume ls docker exec mysql /usr/bin/mysqldump -u root -pmysecret mydb > backup.sql docker exec mysql /usr/bin/mysqldump -u root -pmysecret -r mydb | Set-Content backup.sql docker cp mycontainer:/some/file ./host/directory docker volume rm <name> docker volume prune docker system prune -a --volumes docker exec -it <name> bash docker exec -it <name> sh
centos删除docker0虚拟网卡
# 停止docker服务 service docker stop # 用ip命令使docker0网卡down掉 ip link set dev docker0 down # 删除网卡 brctl delbr docker0
安装
Linux 上安装
系统要求
内核要求3.10或以上版本
系统架构要求64位(x86_64)
a、安装
curl https://get.docker.com > /tmp/install_docker.sh cat /tmp/install_docker.sh chmod +x /tmp/install_docker.sh /tmp/install_docker.sh
b、禁止SELinux
sudo setenforce 0
c、不使用 sudo 执行 docker
sudo usermod -aG docker $USER
其他系统安装
Windows 和 MAC 系统的容器安装参考Destop工具,如官网所示。https://docs.docker.com/ee/desktop/
确认版本
docker version
常用操作
运行镜像
docker run debian echo "hello world"
debian 是使用的镜像名称,Docker 从 Docker Hub 下载 Debian 的最新版本的镜像。可以通过以下的指令执行容器中的 Shell。
镜像加速
默认情况下新的镜像从 Docker Hub 在线下载,国内速度较慢,可以使用镜像加速的方式
docker run -i -t debian /bin/bash
/bin/bash 表示获得 bash shell 。当退出 shell 时,容器就会停止(主进程运行多久,容器就运行多久)
基础指令
docker run -h container -i -t debian /bin/bash
进入 container容器后移动了 /bin 的位置导致该容器无法使用,通过主机端的指令可以看到容器的详细信息。
docker ps docker inspect wizardly_burnell
docker inspect wizardly_burnell |grep IPAddress docker inspect --format {{}.NetworkSettings.IPAddress}} wizardly_burnell
docker diff wizardly_burnell
可以看到在这个容器内,哪些文件被改动过;例如被删除的 /bin 以及新增的 /basket 和它下面的文件等。
docker logs wizardly_burnell
查看容器的执行 log 情况。
docker ps -a
查看所有的容器,包括已经停止的容器。由于之前的容器已被破坏(移动了 /bin,无法正常启动)通过 rm 的容器指令删除。
docker rm wizardly_burnell
清理已停止的容器
docker rm -v $(docker ps -aq -f status=exited)
创建 cowsay 的容器应用,先启动容器并在容器中安装系统包
docker run -it --name cowsay --hostname cowsay debian bash apt-get upudate apt-get install -y cowsay fortune /usr/games/fortune | /usr/games/cowsay exit docker commit cowsay test/cowsayimage
Dockerfile 创建镜像
mkdir cowsay cd cowsay touch Dockerfile FROM debian:buster RUN apt-get update && apt-get install -y cowsay fortune docker build -t test/cowsay-dockerfile . docker run test/cowsay-dockerfile /usr/games/cowsay "Docker-file"
进一步可以通 Dockerfile 的 ENTRYPOINT 指令执行可执行文件,同时能处理传给 docker run 的参数。在 Dockerfile 的最后一行加入 ENTRYPOINGT ["/usr/games/cowsay"] 并再次生成新镜像,新生成的镜像可以无需指定 cowsay 指令。
也可以在 ENTRYPOINT 中指定脚步既简化指令操作又可以保留原有命令的输入能力。在 Dockerfile 同文件夹下新建以下的脚本,然后通过 ENTRYPOINT 命令调用。
#!/bin/bash if [ $# -eq 0 ]; then /usr/games/fortune | /usr/games/cowsay else /usr/games/cowsay "$@" fi
Dockfile
FROM debian:buster
RUN apt-get update && apt-get install -y cowsay fortune
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
镜像注册服务
注册、仓库、标签
注册(registry)托管和发布镜像的服务,默认为 docker Hub。
仓库(repository)相关镜像的集合
标签(tag)仓库中镜像的识别号,由英文和数字组成。
docker build 创建镜像
docker push 上传镜像(个人,需要注册账户)
docker pull 下载镜像
镜像命名空间
1、字符串和 / 开头
属于个人用户。例如 amouat/reveljs 是用户 amouat 上传的 reveljs 镜像。
2、不包含 /
属于认证组织。例如 debian 是官方镜像的发行版本
3、已主机名或 IP 开头
第三方组织或企业版本
使用 redis 镜像
1、先下载 redis 镜像然后让它在后台执行
2、通过--link 指令将新的容器 redis 和已运行的容器 myredis 连接起来,并且在新容器中以 redis 作为 myredis 容器的主机名。Docker 会在新容器中的 /etc/hosts 里添加一条新记录,把 redis 指向 myredis 的 IP 地址。
docker pull redis docker run --name myredis -d redis docker run --rm -it --link myredis:redis redis /bin/bash redis-cli -h redis -p 6379
数据间的传输和共享通过 Dockerfile 中的 VOLUME 指令或运行时使用 -v 选项。
默认情况下目录或文件会挂载在主机的 Docker 安装目录下(通常是 /var/lib/docker),实际运行时可以指定具体的挂载路径(docker run -d -v /host/dir:/container/dir test/webserver)
可以通过使用 --volumes-from 将新容器连接到 Redis 数据库目录。
VOLUME /data
docker run -v /data test/webserver docker run --rm -it --link myredis:redis redis /bin/bash redis-cli -h redis -p 6379 set "persistence" "test" save exit docker run -it --volumes-from myredis -v $(pwd)/backup:/backup debian /bin/bash cp /data/dump.rdp /backup
进入后台容器
docker exec -it myredis /bin/bash
3、清理容器
- 无标签
添加评论