跳转到内容

Docker基础使用

docker-poster

docker是为了解决跨环境迁移软件的时候由于环境不同出现的“水土不服”问题,保证软件在不同的环境中的运行环境是一致的。

是将程序与其运行所需的环境放在一起打的包。

将image与其他image隔离开运行的环境。image与container的关系很像类与对象的关系。

有官方提供的仓库https://hub.docker.com,用于将一个个image分享出来,也可以创建私有仓库。

数据卷是宿主机中的一个目录或文件,一个容器可以挂载多个数据卷,一个数据卷也可以被多个容器同时挂载,从而实现容器数据持久化、外部机器与容器的间接通信、容器与容器的数据交换

在创建容器时通过-v命令

指用于在容器之间进行数据交换的容器

创建过程:

Terminal window
# 创建数据卷容器
docker run -itd --name DATA_CONTAINER_NAME -v /volume IMAGE_NAME:TAG
# 创建两个需要数据交换的容器并与数据卷容器连接
docker run -itd --name CONTAINER_NAME1 --volumes-from DATA_CONTAINER_NAME IMAGE_NAME:TAG
docker run -itd --name CONTAINER_NAME2 --volumes-from DATA_CONTAINER_NAME IMAGE_NAME:TAG

以debian 13为例,其他的可以去docker官网安装指南查看。

Terminal window
apt update
apt install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
apt update
# 设置docker镜像加速
tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.1ms.run"
]
}
EOF
apt install -y docker-ce docker-ce-cli containerd.io
systemctl daemon-reload
systemctl start docker
systemctl status docker
  • 启动docker

    Systemctl start docker

  • 停止docker

    Systemctl stop docker

  • 重新启动docker

    systemctl restart docker

  • 查看docker状态

    Systemctl status docker

  • 将docker设置为开机启动

    systemctl enable docker

  • 查看本地镜像列表

    docker images

  • 从网络中搜索镜像

    docker search POSSIBLE_IMAGE_NAME

  • 获取镜像

    docker pull IMAGE_NAME:IMAGE_VERSION,例如docker pull mysql:5.7,如果不指定版本,则为latest。

  • 获取镜像ID列表

    docker images -q

  • 删除一个镜像

    • 根据镜像名称

      docker image rm IMAGE_NAME:IMAGE_VERSION

    • 根据镜像ID

      docker image rm IMAGE_ID,如果某个镜像安装的特定版本和latest版本相同,则两者ID相同,此时可以通过名称删除。

  • 删除所有镜像

    docker image rm `docker images -q`

docker image rm快捷写法是docker rmi

  • 查看正在运行的容器

    docker ps

  • 查看所有容器

    docker ps -a

  • 查看所有容器的ID

    docker ps -aq

  • 创建容器

    docker run [COMMANDS] IMAGE_NAME:TAG /IMAGE_ID [OPTIONS]

    COMMANDS包括:

    • -i

      在没有客户端连接到容器时也保持容器运行

    • -t

      给容器分配一个伪终端

    • -d

      保持容器后台运行

    • -v

      配置数据卷,例如:-v HOST_DIR/HOST_FILE:CONTAINER_DIR/CONTAINER_FILE,目录必须是绝对路径,目录不存在则会自动创建,可以挂载多个数据卷

    • –name CONTAINER_NAME

      为容器起个名字

    OPTIONS包括:

    • /bin/bash

      进入到为容器分配的伪终端中

  • 进入容器

    docker exec [COMMANDS] CONTAINER_NAME

    COMMANDS与创建容器时的类似

  • 退出容器

    exit

  • 启动容器

    docker start CONTAINER_NAME/CONTAINER_ID

  • 停止容器

    docker stop CONTAINER_NAME/CONTAINER_ID

  • 删除容器

    docker rm CONTAINER_NAME/CONTAINER_ID,不能删除正在运行的容器,删除之前需要先停止。

  • 删除所有容器

    docker rm 'docker ps -aq'

  • 查看容器信息

    docker inspect CONTAINER_NAME/CONTAINER_ID

Linux文件文件系统有bootfs和rootfs两部分组成,不同的linux发行版bootfs基本一样,rootfs不同:

  • bootfs

    包含bootloader(引导加载程序)和kernel(内核)

  • rootfs

    root文件系统,/etc /root 等等。

Dcoker镜像是由特殊的文件系统叠加而成的。最底端是bootfs,第二层是rootfs,再往上可以叠加其他的镜像文件。

统一文件系统技术将不同的层整合在一起提供统一的视角,从用户的视角就是一个文件系统。

一个镜像可以放在另一个镜像上面,下面的成为父镜像。

![截屏2022-07-12 上午10.19.20](/Users/xyb/Desktop/notes/Docker教程.assets/截屏2022-07-12 上午10.19.20.png)

为什么有的镜像比安装包小很多?

Section titled “为什么有的镜像比安装包小很多?”

最底端是bootfs,可以利用宿主系统的bootfs

为什么有的镜像比安装包大很多?

Section titled “为什么有的镜像比安装包大很多?”

这种镜像内部很可能嵌套了多层镜像

值得注意的是,在将容器转为镜像的过程中,在宿主机与容器挂载的文件或目录中做的更改不会转化,但在容器中对目录或文件的修改则会转化。

Terminal window
# 将容器转为镜像
docker commit CONTAINER_ID IMAGE_NAME:TAG
# 将镜像转为压缩文件,用于传输
docker save -o COMPRESSED_FILE_NAME IMAGE_NAME:TAG
# 获取压缩文件的机器可以加载压缩文件中的镜像
docker load -i COMPRESSED_FILE_NAME

就是一个普通的文本配置文件,docker根据配置创建镜像,下方是示例:

# 指定父镜像
FROM FATHER_IMAGE_NAME:TAG
# 作者信息
MAINTAINER AUTHER_NAME<AUTHER_EMAIL>
# 标签
# 可以按照如下方式写多个
# LABEL "com.example.vendor"="ACME Incorporated"
# LABEL com.example.label-with-value="foo"
# LABEL version="1.0"
# LABEL description="This text illustrates \
# that label-values can span multiple lines."
# 也可以如下方式写
# LABEL multi.label1="value1" \
# multi.label2="value2" \
# other="value3"
# 或者是
# LABEL multi.label1="value1" multi.label2="value2" other="value3"
LABEL <key>=<value> <key>=<value> <key>=<value> ...
# 执行Linux命令,创建容器的时候执行
# 例如:RUN /bin/bash -c 'source $HOME/.bashrc; \
# echo $HOME'
# 或者:RUN ["/bin/bash", "-c", "echo hello"]
RUN DOMMAND/["command", "param1", "param2"]
# 挂载数据卷
VOLUME HOST_PATH CONTAINER_PATH
# 环境变量
ENV PARAM_NAME=PARAM_VALUE
# 工作目录,即容器启动后进入容器伪终端时的默认目录
WORKDIR /usr
# 暴露端口,即端口映射,可以指定协议
EXPOSE PORT/PROTOCAL?
# 执行Linux命令,在容器启动的时候执行
CMD ["command", "param1", "param2"]
# 复制文件到image中
COPY
# 添加文件
ADD

写好配置文件后就可以制作镜像了:

Terminal window
# 制作镜像
# -f 指定dockerfile的路径
# -t 指定构建后镜像的名称和版本
# 最后的点表示寻址的路径
docker build -f DOCKER_FILE_PATH -t IMAGE_NAME:TAG .
  • 制作springboot项目镜像dockerfile

    Terminal window
    FROM java:8
    # 前面的是相对当前目录jar包的位置 后面的是容器内的路径
    ADD XXXX.jar app.jar
    CMD java -jar app.jar

这是docker的配置文件,存储在/etc/docker目录下,详细配置如下:

{
// docker相关配置,启动对应配置时将注释去掉即可
// "allow-nondistributable-artifacts": [],
// "api-cors-header": "",
// "authorization-plugins": [],
// "bip": "",
// "bridge": "",
// "cgroup-parent": "",
// "cluster-advertise": "",
// "cluster-store": "",
// "cluster-store-opts": {},
// "containerd": "/run/containerd/containerd.sock",
// "containerd-namespace": "docker",
// "containerd-plugin-namespace": "docker-plugins",
// 指定数据目录,docker产生的数据将在这里存储,默认是/var/lib/docker
"data-root": "/data/docker",
// "debug": true,
// "default-address-pools": [
// {
// "base": "172.30.0.0/16",
// "size": 24
// },
// {
// "base": "172.31.0.0/16",
// "size": 24
// }
// ],
// "default-cgroupns-mode": "private",
// "default-gateway": "",
// "default-gateway-v6": "",
// "default-runtime": "runc",
// "default-shm-size": "64M",
// "default-ulimits": {
// "nofile": {
// "Hard": 64000,
// "Name": "nofile",
// "Soft": 64000
// }
// },
// "dns": [],
// "dns-opts": [],
// "dns-search": [],
// "exec-opts": [],
// "exec-root": "",
// "experimental": false,
// "features": {},
// "fixed-cidr": "",
// "fixed-cidr-v6": "",
// "group": "",
// "hosts": [],
// "icc": false,
// "init": false,
// "init-path": "/usr/libexec/docker-init",
// 私有仓库位置
"insecure-registries": [],
// "ip": "0.0.0.0",
// "ip-forward": false,
// "ip-masq": false,
// "iptables": false,
// "ip6tables": false,
// "ipv6": false,
// "labels": [],
// "live-restore": true,
// 日志引擎,默认是json-file
"log-driver": "json-file",
// 日志级别
// "log-level": "",
// 日志配置
"log-opts": {
// 禁用缓存
"cache-disabled": "false",
// 最多缓存文件数量
"cache-max-file": "5",
// 每个缓存文件最大大小
"cache-max-size": "20m",
// 压缩缓存文件
"cache-compress": "true",
//
"env": "os,customer",
// "labels": "somelabel",
// 最多日志文件数量
"max-file": "10",
// 每个日志文件最大大小
"max-size": "10m"
},
// "max-concurrent-downloads": 3,
// "max-concurrent-uploads": 5,
// "max-download-attempts": 5,
// "mtu": 0,
// "no-new-privileges": false,
// "node-generic-resources": [
// "NVIDIA-GPU=UUID1",
// "NVIDIA-GPU=UUID2"
// ],
// "oom-score-adjust": -500,
// "pidfile": "",
// "raw-logs": false,
// 仓库镜像,可以加速下载镜像
"registry-mirrors": [
// docker官方镜像
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn/",
"https://hub-mirror.c.163.com/"
],
// "runtimes": {
// "cc-runtime": {
// "path": "/usr/bin/cc-runtime"
// },
// "custom": {
// "path": "/usr/local/bin/my-runc-replacement",
// "runtimeArgs": [
// "--debug"
// ]
// }
// },
// "seccomp-profile": "",
// "selinux-enabled": false,
// "shutdown-timeout": 15,
// "storage-driver": "",
// "storage-opts": [],
// "swarm-default-advertise-addr": "",
// "tls": true,
// "tlscacert": "",
// "tlscert": "",
// "tlskey": "",
// "tlsverify": true,
// "userland-proxy": false,
// "userland-proxy-path": "/usr/libexec/docker-proxy",
//
// 不注释下面的行,这样能保证json语法正确
"userns-remap": ""
}

更新完成之后需要重启docker服务才会生效:

Terminal window
# 加载配置文件
systemctl daemon-reload
# 重启docker生效
systemctl restart docker