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、清理容器

  • 无标签
写评论...