Docker基础使用

docker的使命
Section titled “docker的使命”docker是为了解决跨环境迁移软件的时候由于环境不同出现的“水土不服”问题,保证软件在不同的环境中的运行环境是一致的。
镜像-image
Section titled “镜像-image”是将程序与其运行所需的环境放在一起打的包。
容器-container
Section titled “容器-container”将image与其他image隔离开运行的环境。image与container的关系很像类与对象的关系。
仓库-Registry
Section titled “仓库-Registry”有官方提供的仓库https://hub.docker.com,用于将一个个image分享出来,也可以创建私有仓库。
数据卷是宿主机中的一个目录或文件,一个容器可以挂载多个数据卷,一个数据卷也可以被多个容器同时挂载,从而实现容器数据持久化、外部机器与容器的间接通信、容器与容器的数据交换
在创建容器时通过-v命令
指用于在容器之间进行数据交换的容器
创建过程:
# 创建数据卷容器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:TAGdocker run -itd --name CONTAINER_NAME2 --volumes-from DATA_CONTAINER_NAME IMAGE_NAME:TAG以debian 13为例,其他的可以去docker官网安装指南查看。
apt updateapt install -y ca-certificates curlinstall -m 0755 -d /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.ascchmod a+r /etc/apt/keyrings/docker.asctee /etc/apt/sources.list.d/docker.sources <<EOFTypes: debURIs: https://download.docker.com/linux/debianSuites: $(. /etc/os-release && echo "$VERSION_CODENAME")Components: stableArchitectures: $(dpkg --print-architecture)Signed-By: /etc/apt/keyrings/docker.ascEOFapt update# 设置docker镜像加速tee /etc/docker/daemon.json <<EOF{ "registry-mirrors": [ "https://docker.1ms.run" ]}EOFapt install -y docker-ce docker-ce-cli containerd.iosystemctl daemon-reloadsystemctl start dockersystemctl 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
container
Section titled “container”-
查看正在运行的容器
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
Dockerfile
Section titled “Dockerfile”Docker镜像原理
Section titled “Docker镜像原理”Linux文件文件系统有bootfs和rootfs两部分组成,不同的linux发行版bootfs基本一样,rootfs不同:
-
bootfs
包含bootloader(引导加载程序)和kernel(内核)
-
rootfs
root文件系统,/etc /root 等等。
Dcoker镜像是由特殊的文件系统叠加而成的。最底端是bootfs,第二层是rootfs,再往上可以叠加其他的镜像文件。
统一文件系统技术将不同的层整合在一起提供统一的视角,从用户的视角就是一个文件系统。
一个镜像可以放在另一个镜像上面,下面的成为父镜像。

为什么有的镜像比安装包小很多?
Section titled “为什么有的镜像比安装包小很多?”最底端是bootfs,可以利用宿主系统的bootfs
为什么有的镜像比安装包大很多?
Section titled “为什么有的镜像比安装包大很多?”这种镜像内部很可能嵌套了多层镜像
值得注意的是,在将容器转为镜像的过程中,在宿主机与容器挂载的文件或目录中做的更改不会转化,但在容器中对目录或文件的修改则会转化。
# 将容器转为镜像docker commit CONTAINER_ID IMAGE_NAME:TAG# 将镜像转为压缩文件,用于传输docker save -o COMPRESSED_FILE_NAME IMAGE_NAME:TAG# 获取压缩文件的机器可以加载压缩文件中的镜像docker load -i COMPRESSED_FILE_NAMEdockerfile
Section titled “dockerfile”就是一个普通的文本配置文件,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写好配置文件后就可以制作镜像了:
# 制作镜像# -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.jarCMD java -jar app.jar
daemon.json
Section titled “daemon.json”这是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服务才会生效:
# 加载配置文件systemctl daemon-reload# 重启docker生效systemctl restart docker