1、简介
docker官方网站:https://www.docker.com
docker官方文档:https://docs.docker.com
docker镜像仓库:https://hub.docker.com
2、名词解释
镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器。tomcat镜像 ==> run ==> tomcat01容器(提供服务器)。通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):
docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。启动,停止,删除,基本命令。可以把这个容器理解为就是一个简易的linux系统。
仓库(repository):
仓库就是存放镜像的地方。仓库分为公有仓库和私有仓库。
3、安装
服务器的linux环境版本:CentOs7。
使用xShell连接远端服务器。
[root@work /home/work/docker]#
[root@work /home/work/docker]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"[root@work /home/work/docker]#
[root@work /home/work/docker]#
安装步骤:
https://docs.docker.com/engine/install/centos/
1、卸载旧的版本yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2、安装基础包
yum install -y yum-utils
yum makecache fast 更新3、设置镜像仓库(设置国内的阿里云镜像地址)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo 4、安装docker(ce 社区版)
yum install docker-ce docker-ce-cli containerd.io
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io 安装固定版本5、启动docker
systemctl start docker6、查看是否成功
docker run hello-word
docker versionClient:Version: 20.10.17API version: 1.40Go version: go1.17.11Git commit: 100c701Built: Mon Jun 6 22:56:42 2022OS/Arch: linux/amd64Context: defaultExperimental: trueServer: Docker Engine - CommunityEngine:Version: 19.03.15API version: 1.40 (minimum version 1.12)Go version: go1.13.15Git commit: 99e3ed8Built: Sat Jan 30 03:18:13 2021OS/Arch: linux/amd64Experimental: falsecontainerd:Version: v1.6.6GitCommit: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1runc:Version: 1.1.2GitCommit: v1.1.2-0-ga916309fdocker-init:Version: 0.19.0GitCommit: de40ad07、卸载
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
4、docker run的流程
运行命令(docker run hello-word)后触发的一系列步骤如下:
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from hub-official/hello-world
e6590344b1a5: Pull complete
Digest: sha256:7e1a4e2d11e2ac7a8c3f768d4166c2defeb09d2a750b010412b6ea13de1efb19
Status: Downloaded newer image for hello-world:latestHello from Docker!
This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.(amd64)3. The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID:https://hub.docker.com/For more examples and ideas, visit:https://docs.docker.com/get-started/[root@work /home/work/docker]#
[root@work /home/work/docker]#
5、常用命令
5.1、基础命令
docker help
docker version
docker info
5.2、镜像命令
1、查看所有本地镜像(docker images)(docker images --help)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker images
镜像名称 版本标签 唯一标识 创建时间 占用空间
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 74cc54e27dc4 2 months ago 10.1kB
[root@work /home/work/docker]#
[root@work /home/work/docker]# 2、查看镜像详情(docker inspect <镜像名或ID>)[root@work /home/work/docker]#
[root@work /home/work/docker]# docker inspect 74cc54e27dc4
{{.......}
}
[root@work /home/work/docker]#
[root@work /home/work/docker]#
1、搜索镜像(docker search <关键词>)[root@work /home/work/docker]#
[root@work /home/work/docker]# docker search centos
.........
[root@work /home/work/docker]#
[root@work /home/work/docker]# 2、下载镜像到本地(docker pull [选项] <镜像名:标签>)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker search centos
Using default tag: latest
.........
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker search centos:7
.........
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker pull centos
Using default tag: latest
latest: Pulling from centos
f44aa91f26be: Pull complete
Digest: sha256:f27f4bb47cfb1dcf0b36e946823b2927c5b9fcc90d3c1fc67d6629b7b5837071
Status: Downloaded newer image for centos:latest
centos:latest
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker pull centos:7
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 501f90710a40 5 weeks ago 217MB
centos latest 501f90710a40 5 weeks ago 217MB
hello-world latest 74cc54e27dc4 2 months ago 10.1kB
[root@work /home/work/docker]#
[root@work /home/work/docker]#
1、删除镜像(docker rmi <镜像名或ID>)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 501f90710a40 5 weeks ago 217MB
centos latest 501f90710a40 5 weeks ago 217MB
hello-world latest 74cc54e27dc4 2 months ago 10.1kB
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# # 默认删除的是tag是latest
[root@work /home/work/docker]# docker rmi centos
Untagged: centos:latest
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 501f90710a40 5 weeks ago 217MB
hello-world latest 74cc54e27dc4 2 months ago 10.1kB
[root@work /home/work/docker]#
[root@work /home/work/docker]# 2、删除所有镜像(docker rmi -f $(docker images -aq))[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
1、使用dockerfile创建镜像(docker build -t <镜像名:标签> <上下文路径>)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# 2、多阶段构建()[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
1、镜像导出文件(docker save -o <文件名.tar> <镜像名:标签>)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker save -o hello-word.tar hello-world:latest
[root@work /home/work/docker]# ll
total 20
-rw------- 1 root docker 19968 Mar 25 18:17 hello-word.tar
[root@work /home/work/docker]#
[root@work /home/work/docker]# 2、文件导入镜像(docker load -i <文件名.tar>)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker load -i hello-word.tar
Loaded image: hello-world:latest
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 501f90710a40 5 weeks ago 217MB
centos latest 501f90710a40 5 weeks ago 217MB
hello-world latest 74cc54e27dc4 2 months ago 10.1kB
[root@work /home/work/docker]#
[root@work /home/work/docker]#
5.3、容器命令
1、创建并启动容器(docker run [选项] <镜像名> [命令])常用选项:-d 后台运行(守护模式) docker run -d nginx--name 指定容器名称 --name my-nginx-p 端口映射(主机:容器) -p 8080:80-v 挂载数据卷/目录 -v /宿主机路径:/容器路径-e 设置环境变量 -e MYSQL_ROOT_PASSWORD=123--rm 容器退出后自动删除 --rm-it 交互式终端(通常搭配 /bin/bash 使用) -it ubuntu /bin/bash[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 501f90710a40 5 weeks ago 217MB
centos latest 501f90710a40 5 weeks ago 217MB
hello-world latest 74cc54e27dc4 2 months ago 10.1kB
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# # 进入容器的交互式终端
[root@work /home/work/docker]# docker run -it --rm centos:7 /bin/bash
[root@e2516f2b0746 /]#
[root@e2516f2b0746 /]# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@e2516f2b0746 /]#
[root@e2516f2b0746 /]# exit
exit
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# # 进入容器的交互式终端
[root@work /home/work/docker]# docker run -it centos:7 /bin/bash
[root@e2516f2b0746 /]#
[root@e2516f2b0746 /]# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@e2516f2b0746 /]#
[root@e2516f2b0746 /]# exit
exit
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ee7c7f8929d centos:7 "/bin/bash" 11 seconds ago Exited (0) 6 seconds ago wonderful_solomon
[root@work /home/work/docker]#
[root@work /home/work/docker]#
1、启动容器(docker start <容器名或ID>)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ee7c7f8929d centos:7 "/bin/bash" 11 seconds ago Exited (0) 6 seconds ago wonderful_solomon
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker start 7ee7c7f8929d
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ee7c7f8929d centos:7 "/bin/bash" 11 seconds ago up (0) 6 seconds wonderful_solomon
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# 2、停止容器(docker stop <容器名或ID>)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker stop 7ee7c7f8929d
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ee7c7f8929d centos:7 "/bin/bash" 11 seconds ago Exited (137) 9 seconds ago wonderful_solomon
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# 3、重启容器(docker restart <容器名或ID>)4、强制终止(docker kill <容器名或ID>)5、暂停容器(docker pause <容器名或ID>)6、恢复容器(docker unpause <容器名或ID>)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
1、查看运行中的容器(docker ps)2、查看所有容器(docker ps -a)3、仅显示容器ID(docker ps -q)4、过滤状态(docker ps -f "status=exited")5、查看容器详情(docker inspect <容器名或ID>)6、查看容器日志(docker logs [选项] <容器名或ID>)7、查看容器内进程(docker top <容器名或ID>)9、实时查看资源占用(docker stats)
1、进入容器(docker exec -it <容器名或ID> <命令>)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker exec -it 7ee7c7f8929d /bin/bash
[root@7ee7c7f8929d /]#
[root@7ee7c7f8929d /]#
[root@7ee7c7f8929d /]# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@7ee7c7f8929d /]#
[root@7ee7c7f8929d /]#
[root@7ee7c7f8929d /]#
[root@7ee7c7f8929d /]# ll mnt
total 0
[root@7ee7c7f8929d /]#
[root@7ee7c7f8929d /]# vim /mnt/aaa.txt
bash: vim: command not found
[root@7ee7c7f8929d /]# touch /mnt/aaa.txt
[root@7ee7c7f8929d /]#
[root@7ee7c7f8929d /]#
[root@7ee7c7f8929d /]# ll /mnt
total 0
-rw-r--r-- 1 root root 0 Mar 26 15:22 aaa.txt
[root@7ee7c7f8929d /]# exit
exit
[root@work /home/work/docker]#
[root@work /home/work/docker]#
1、删除已停止的容器(docker rm <容器名或ID>)2、删除运行中的容器(docker rm -f <容器名或ID>)3、删除所有已停止的容器(docker container prune)
1、从容器复制文件到主机(docker cp <容器名\ID:容器内路径> <宿主机路径>)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker cp 7ee7c7f8929d:/mnt/aaa.txt centos/
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# ll centos/
total 0
-rw-r--r-- 1 root root 0 Mar 26 15:22 aaa.txt
[root@work /home/work/docker]#
[root@work /home/work/docker]# 2、从主机复制文件到容器(docker cp <宿主机路径> <容器名:容器内路径>)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
1、导出容器为镜像(docker commit <容器名或ID> <新镜像名:标签>)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker commit 7ee7c7f8929d centos:8888
sha256:05474d8a88a915a2ed7092e62ffcc1f741edb0c8e4bb1fc3a68efa4b04df08c7
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 8888 05474d8a88a9 5 seconds ago 217MB
centos 7 501f90710a40 5 weeks ago 217MB
centos latest 501f90710a40 5 weeks ago 217MB
hello-world latest 74cc54e27dc4 2 months ago 10.1kB
[root@work /home/work/docker]#
[root@work /home/work/docker]#
5.4、卷命令
1、创建卷(docker volume create volum_name)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker volume create centos_volume
centos_volume
[root@work /home/work/docker]#
[root@work /home/work/docker]# 2、查看卷(docker volume ls)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker volume ls
DRIVER VOLUME NAME
local centos_volume
[root@work /home/work/docker]#
[root@work /home/work/docker]# 3、查看卷详情(docker volume inspect volume_name)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker volume inspect centos_volume
[{"CreatedAt": "2025-03-26T16:13:13+08:00","Driver": "local","Labels": {},"Mountpoint": "/home/docker/volumes/centos_volume/_data","Name": "centos_volume","Options": {},"Scope": "local"}
]
[root@work /home/work/docker]#
[root@work /home/work/docker]# 4、删除卷(docker volume rm volume_name)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker volume rm centos_volume
centos_volume
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker volume ls
DRIVER VOLUME NAME
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker volume create centos_volume
centos_volume
[root@work /home/work/docker]#
[root@work /home/work/docker]# 5、删除所有未使用的卷(docker volume prune)
1、运行容器时挂载卷()[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker run -it -v centos_volume:/mnt/ --name centos_1 centos:7 /bin/bash
[root@7368bd0f39b4 /]#
[root@7368bd0f39b4 /]#
[root@7368bd0f39b4 /]#
[root@7368bd0f39b4 /]# cd /mnt/
[root@7368bd0f39b4 /mnt]# ll
total 0
[root@7368bd0f39b4 /mnt]#
[root@7368bd0f39b4 /mnt]#
[root@7368bd0f39b4 /mnt]# echo "aaaa\nbbbbb\nccccccccccc\n\n\ndddddd" >> abc.txt
[root@7368bd0f39b4 /mnt]# more abc.txt
aaaa\nbbbbb\nccccccccccc\n\n\ndddddd
[root@7368bd0f39b4 /mnt]#
[root@7368bd0f39b4 /mnt]#
[root@7368bd0f39b4 /mnt]#
[root@7368bd0f39b4 /mnt]#
[root@7368bd0f39b4 /mnt]#
[root@7368bd0f39b4 /mnt]#
[root@7368bd0f39b4 /mnt]# echo "aaaa\nbbbbb\nccccccccccc\n\n\ndddddd" >> ab.txt
[root@7368bd0f39b4 /mnt]# echo "aaaa\nbbbbb\nccccccccccc\n\n\ndddddd" >> abd.txt
[root@7368bd0f39b4 /mnt]# ll
total 12
-rw-r--r-- 1 root root 37 Mar 26 16:27 ab.txt
-rw-r--r-- 1 root root 37 Mar 26 16:26 abc.txt
-rw-r--r-- 1 root root 37 Mar 26 16:27 abd.txt
[root@7368bd0f39b4 /mnt]#
[root@7368bd0f39b4 /mnt]#
[root@7368bd0f39b4 /mnt]#
[root@7368bd0f39b4 /mnt]#
[root@7368bd0f39b4 /mnt]# rm -rf ab.txt
[root@7368bd0f39b4 /mnt]# ll
total 8
-rw-r--r-- 1 root root 37 Mar 26 16:26 abc.txt
-rw-r--r-- 1 root root 37 Mar 26 16:27 abd.txt
[root@7368bd0f39b4 /mnt]# cd../
bash: cd../: No such file or directory
[root@7368bd0f39b4 /mnt]# ll
total 8
-rw-r--r-- 1 root root 37 Mar 26 16:26 abc.txt
-rw-r--r-- 1 root root 37 Mar 26 16:27 abd.txt
[root@7368bd0f39b4 /mnt]# cd ../
[root@7368bd0f39b4 /]# ll
total 56
-rw-r--r-- 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx 1 root root 7 Nov 13 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 Mar 26 16:26 dev
drwxr-xr-x 1 root root 4096 Mar 26 16:26 etc
drwxr-xr-x 4 root root 4096 Feb 14 16:23 home
lrwxrwxrwx 1 root root 7 Nov 13 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 13 2020 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 11 2018 media
drwxr-xr-x 2 root root 4096 Mar 26 16:27 mnt
drwxr-xr-x 2 root root 4096 Apr 11 2018 opt
dr-xr-xr-x 255 root root 0 Mar 26 16:26 proc
dr-xr-x--- 2 root root 4096 Nov 13 2020 root
drwxr-xr-x 12 root root 4096 Feb 14 16:24 run
lrwxrwxrwx 1 root root 8 Nov 13 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 May 15 2023 sys
drwxrwxrwt 7 root root 4096 Feb 14 16:24 tmp
drwxr-xr-x 13 root root 4096 Nov 13 2020 usr
drwxr-xr-x 18 root root 4096 Nov 13 2020 var
[root@7368bd0f39b4 /]# ll /mnt/
total 8
-rw-r--r-- 1 root root 37 Mar 26 16:26 abc.txt
-rw-r--r-- 1 root root 37 Mar 26 16:27 abd.txt
[root@7368bd0f39b4 /]#
[root@7368bd0f39b4 /]#
[root@7368bd0f39b4 /]# exit
exit
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# ll /home/docker/volumes/centos_volume/_data/
total 8
-rw-r--r-- 1 root root 37 Mar 26 16:26 abc.txt
-rw-r--r-- 1 root root 37 Mar 26 16:27 abd.txt
[root@work /home/work/docker]#
[root@work /home/work/docker]# 2、挂载主机目录()[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker run -it -v centos_v:/mnt/ --name centos_2 centos:7 /bin/bash
[root@2ea8a0733971 /]# ll /mnt/
total 0
[root@2ea8a0733971 /]#
[root@2ea8a0733971 /]#
[root@2ea8a0733971 /]#
[root@2ea8a0733971 /]#
[root@2ea8a0733971 /]#
[root@2ea8a0733971 /]# cd mnt/
[root@2ea8a0733971 /mnt]#
[root@2ea8a0733971 /mnt]#
[root@2ea8a0733971 /mnt]# touch xyz.txt
[root@2ea8a0733971 /mnt]# touch xya.txt
[root@2ea8a0733971 /mnt]#
[root@2ea8a0733971 /mnt]#
[root@2ea8a0733971 /mnt]# exit
exit
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# ll /home/docker/volumes/centos_v/_data/
total 0
-rw-r--r-- 1 root root 0 Mar 26 16:30 xya.txt
-rw-r--r-- 1 root root 0 Mar 26 16:30 xyz.txt
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62d5b46cf5b4 centos:7 "/bin/bash" 9 seconds ago Exited (0) 6 seconds ago centos_2
2377f2efbe58 centos:7 "/bin/bash" 48 seconds ago Exited (0) 45 seconds ago centos_1
[root@work /home/work/docker]#
[root@work /home/work/docker]# 3、只读挂在(ro)[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# # 绝对路径的情况下,本地目录和docker目录匹配;
[root@work /home/work/docker]# # 相对目录的情况下,会创建在/home/docker/volumes/目录下
[root@work /home/work/docker]# docker run -it -v /home/work/docker/contos_v:/mnt/:ro --name centos_3 centos:7 /bin/bash
[root@8ffdff46dac3 /]# cd mnt/
[root@8ffdff46dac3 /mnt]#
[root@8ffdff46dac3 /mnt]#
[root@8ffdff46dac3 /mnt]# ll
total 0
[root@8ffdff46dac3 /mnt]#
[root@8ffdff46dac3 /mnt]#
[root@8ffdff46dac3 /mnt]#
[root@8ffdff46dac3 /mnt]# mkdir aaa
mkdir: cannot create directory 'aaa': Read-only file system
[root@8ffdff46dac3 /mnt]#
[root@8ffdff46dac3 /mnt]#
[root@8ffdff46dac3 /mnt]#
[root@8ffdff46dac3 /mnt]#
[root@8ffdff46dac3 /mnt]# exit
exit
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# ll
total 28
drwxr-xr-x 2 root root 4096 Mar 26 19:42 contos_v
-rw------- 1 root docker 19968 Mar 25 18:17 hello-word.tar
[root@work /home/work/docker]#
[root@work /home/work/docker]#
5.5、dockerfile(必须)
dockerfile 是一个文本文件,包含一系列指令,用于自动化构建 Docker 镜像。它就像是镜像的“菜谱”,告诉 Docker 如何一步步组装镜像。
构建步骤:
1、编写一个 dockerfile 文件
2、docker build 构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)(类似开源)dockerfile涉及的命令基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
指令:FROM #基础镜镜像,一切从这里开始构建MAINTAINER #镜像是谁写的,姓名+邮箱RUN #镜像构建的时候需要运行的命令ADD #添加内容WORKDIR #镜像的工作目录VOLUME #挂载的目录EXPOSE #暴漏端口配置(网络交互等)CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令ONBUILD #当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD的指令。触发指令。COPY #类似ADD,将文件拷贝到镜像中ENV #构建的时候设置环境变量
DockerHub中99%镜像都是从这个基础镜像(scratch)过来的。
根据Dockerfile构建镜像使用的命令如下:
1、docker build [OPTIONS] PATH | URL | -PATH Dockerfile所在目录(.表示当前目录)URL Git 仓库或远程上下文(如github.com/user/repo)- 从标准输入(stdin读)取 Dockerfile常用选项:选项 说明 示例-t / --tag 指定镜像名称和标签 -t myapp:1.0-f / --file 指定非默认的 Dockerfile 文件 -f Dockerfile.dev--build-arg 传递构建参数(对应 ARG 指令) --build-arg VERSION=1.0--no-cache 禁用缓存,强制重新构建 --no-cache--target 多阶段构建时指定目标阶段 --target builder--pull 强制拉取最新基础镜像 --pull典型用法:1.1、使用当前目录的dockerfile构建镜像,并打标签docker build -t myapp:latest .1.2、使用指定路径的dockerfiledocker build -t myapp -f ./docker/Dockerfile.prod .1.3、传递构建参数# dockerfile中定义ARGARG VERSION=1.0RUN echo "Building version $VERSION"# 构建时覆盖参数docker build -t myapp --build-arg VERSION=2.0 .1.4、多阶段构建不需要构建多个dockerfile文件,而是在单个dockerfile文件中定义多个阶段。多阶段构建的核心思想:阶段1(构建阶段):安装编译工具、依赖库,生成可执行文件。阶段2(运行阶段):仅复制构建结果,丢弃中间工具,使用更小的基础镜像。优势:最终镜像更小(不包含编译工具)更安全(减少攻击面)优化 CI/CD 流程举例:# ----------------- 阶段1:编译 -----------------FROM python:3.11 AS builderWORKDIR /appCOPY requirements.txt .RUN pip install --user -r requirements.txt# ----------------- 阶段2:运行 -----------------FROM python:3.11-slimWORKDIR /appCOPY --from=builder /root/.local /root/.localCOPY . .ENV PATH=/root/.local/bin:$PATHCMD ["python", "app.py"]
示例一:基于centos增加功能,比如vim、ipconfig等命令。
[root@work /home/work/docker/test_centos]#
[root@work /home/work/docker/test_centos]#
[root@work /home/work/docker/test_centos]# more centos_dockerfile
# 基于centos:7镜像,进行开发
FROM centos:7# 该镜像维护者
MAINTAINER aabbcc<aabbcc@qq.com># 声明一个变量MYPATH=/usr/local/
ENV MYPATH /usr/local/# 将MYPATH设置为工作目录,即进入该环境后出现的目录
WORKDIR $MYPATH# 在该环境下安装vim和net-tools
RUN yum -y install vim
RUN yum -y install net-tools# 开放端口8010
EXPOSE 8010# 打印
CMD echo $MYPATH
CMD echo "------- end ------"#
CMD /bin/bash[root@work /home/work/docker/test_centos]#
[root@work /home/work/docker/test_centos]#
[root@work /home/work/docker/test_centos]#
[root@work /home/work/docker/test_centos]# docker build -f centos_dockerfile -t my_centos:0.1234 .
[root@work /home/work/docker/test_centos]#
[root@work /home/work/docker/test_centos]#
[root@work /home/work/docker/test_centos]#
[root@work /home/work/docker/test_centos]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_centos 0.1234 c1f24b4ff1fd 5 seconds ago 220MB
centos 8888 05474d8a88a9 5 seconds ago 217MB
centos 7 501f90710a40 5 weeks ago 217MB
centos latest 501f90710a40 5 weeks ago 217MB
hello-world latest 74cc54e27dc4 2 months ago 10.1kB
[root@work /home/work/docker/test_centos]#
[root@work /home/work/docker/test_centos]#
[root@work /home/work/docker/test_centos]#
[root@work /home/work/docker/test_centos]# docker run -it my_centos:0.1234
[root@work /home/work/docker/test_centos]#
[root@work /home/work/docker/test_centos]#
[root@work /home/work/docker/test_centos]#
示例二:将当前目录的python脚本,放到一个docker中运行,并设置卷,保存python运行的结果。使用dockerfile编写。
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker]# ll test/
total 8
drwxr-xr-x 2 root root 4096 Mar 26 20:20 output/
-rw-r--r-- 1 root root 152 Mar 26 20:15 run_test.py
[root@work /home/work/docker]#
[root@work /home/work/docker]#
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]# ll ./
total 8
-rw-r--r-- 1 root root 321 Mar 26 20:24 dockerfile
drwxr-xr-x 2 root root 4096 Mar 26 20:20 output/
-rw-r--r-- 1 root root 152 Mar 26 20:15 run_test.py
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]# more dockerfile
# 使用官方 Python 基础镜像
FROM pythonRUN apk add --no-cache python3 py3-pip# 设置工作目录
WORKDIR /app# 复制 Python 脚本和依赖文件
COPY run_test.py .# 创建一个目录用于存储输出,/app/output/ 容器内路径
RUN mkdir ./output# 设置容器启动时执行的命令
CMD ["python3", "run_test.py"][root@work /home/work/docker/test]#
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]# docker build -t python-script-runner .
Sending build context to Docker daemon 4.608kB
Step 1/6 : FROM python---> 82d8cd83cd23
Step 2/6 : RUN apk add --no-cache python3 py3-pip---> Running in 52765ded0c2b
fetch http://mirrors.aliyun.com/alpine/v3.16/main/x86_64/APKINDEX.tar.gz
fetch http://mirrors.aliyun.com/alpine/v3.16/community/x86_64/APKINDEX.tar.gz
(1/12) Installing py3-contextlib2 (21.6.0-r2)
(2/12) Installing py3-tomli (2.0.1-r1)
(3/12) Installing py3-pep517 (0.12.0-r2)
(4/12) Installing py3-six (1.16.0-r1)
(5/12) Installing py3-retrying (1.3.3-r3)
(6/12) Installing py3-appdirs (1.4.4-r3)
(7/12) Installing py3-more-itertools (8.13.0-r0)
(8/12) Installing py3-ordered-set (4.0.2-r3)
(9/12) Installing py3-parsing (2.4.7-r3)
(10/12) Installing py3-packaging (21.3-r0)
(11/12) Installing py3-setuptools (59.4.0-r0)
(12/12) Installing py3-pip (22.1.1-r0)
Executing busybox-1.35.0-r17.trigger
OK: 102 MiB in 56 packages
Removing intermediate container 52765ded0c2b---> 590557d82835
Step 3/6 : WORKDIR /app---> Running in 9166862fe0f9
Removing intermediate container 9166862fe0f9---> 06e659a3cccd
Step 4/6 : COPY run_test.py .---> 20049eaec8dc
Step 5/6 : RUN mkdir ./output---> Running in 61cb374e34b1
Removing intermediate container 61cb374e34b1---> 3d5c49f693b2
Step 6/6 : CMD ["python3", "run_test.py"]---> Running in e17d7afc1df8
Removing intermediate container e17d7afc1df8---> 261cda5acee2
Successfully built 261cda5acee2
Successfully tagged python-script-runner:latest
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]# # 构建 Docker 镜像
[root@work /home/work/docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python-script-runner latest bf871a39e07c 17 seconds ago 79.4MB
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]# # 运行容器,并挂载
[root@work /home/work/docker/test]# docker run --rm -v ${PWD}/output:/app/output python-script-runner
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]# ll output/
total 4
-rw-r--r-- 1 root root 20 Mar 26 21:01 res.txt
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]# more output/res.txt
apple
banana
cherry
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]# # 调试
[root@work /home/work/docker/test]# docker run -it --rm --entrypoint sh python-script-runner
/app # ls
output run_test.py
/app #
/app # ls output/
/app #
/app # python3 run_test.py
/app #
/app # ls output/
res.txt
/app #
/app # more output/res.txt
apple
banana
cherry
/app #
/app #
/app # exit
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]# docker history 0b976608fc60
IMAGE CREATED CREATED BY SIZE COMMENT
0b976608fc60 42 hours ago /bin/sh -c #(nop) CMD ["python3" "run_test.… 0B
023c81d61d06 42 hours ago /bin/sh -c mkdir ./output 0B
30e058d540d8 42 hours ago /bin/sh -c #(nop) COPY file:95d7b54ab28af5d4… 159B
20aeb6f7e4a4 42 hours ago /bin/sh -c #(nop) WORKDIR /app 0B
9b81688def3c 42 hours ago /bin/sh -c apk add --no-cache python3 py3-pip 16.5MB
82d8cd83cd23 2 years ago /bin/sh -c set -x && mkdir -p /home/work… 1.92kB
<missing> 2 years ago /bin/sh -c set -x && echo "http://mirror… 73.9MB
<missing> 2 years ago /bin/sh -c #(nop) LABEL ALPINE_VERSION=3.16… 0B
<missing> 2 years ago /bin/sh -c #(nop) LABEL NAME=baidu-base/run… 0B
<missing> 2 years ago /bin/sh -c #(nop) MAINTAINER cmc <cmc@baidu… 0B
<missing> 2 years ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 2 years ago /bin/sh -c #(nop) ADD file:2a949686d9886ac7c… 5.54MB
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]#
[root@work /home/work/docker/test]#
1、命令行解释(docker run -it --entrypoint sh python-script-runner)-it这是两个选项的组合,分别是 -i 和 -t:-i(--interactive):让容器保持标准输入流(stdin)处于打开状态,这样就能与容器进行交互,比如在容器内输入命令等。-t(--tty):为容器分配一个伪终端(TTY),使容器看起来更像一个交互式的终端会话,方便在其中执行命令并看到输出结果。--entrypoint该选项用于覆盖镜像默认的 ENTRYPOINT 设置。在Docker镜像中,ENTRYPOINT定义了容器启动时要执行的默认命令。使用--entrypoint可以指定一个不同的命令来替代镜像原本的ENTRYPOINT。在这个命令里,指定的替代命令是 sh,也就是使用 shell 作为容器启动后执行的命令。python-script-runner这是要使用的Docker镜像的名称。Docker会依据这个镜像来创建并启动容器。也就是说,python-script-runner这个镜像应该包含了运行Python脚本所需的环境和工具。容器启动时运行命令 python3 run_test.py。
5.7、拉取、发布
1、拉取镜像:docker pull [OPTIONS] <镜像名称>[:标签]常用选项:选项 说明-a / --all-tags 拉取镜像的所有标签(慎用,可能体积巨大)--platform 指定平台(如 linux/amd64、linux/arm64)--quiet / -q 静默模式,仅输出镜像 ID# 从 Docker Hub 拉取官方 Nginx 最新版
docker pull nginx# 拉取指定版本(如 Alpine 3.18)
docker pull alpine:3.18# 拉取私有仓库的镜像
docker pull myregistry.example.com/myapp:v1.0# 拉取多平台镜像(需启用 Buildx)
docker pull --platform linux/arm64 ubuntu
1、推送镜像docker push [OPTIONS] <镜像名称>[:标签]步骤:(1) 镜像必须正确标记(Tag)为远程仓库格式:docker tag <本地镜像名> <仓库地址>/<用户名>/<镜像名>:<标签>(2) 登录仓库docker login # 默认 Docker Hubdocker login myregistry.example.com # 私有仓库(3) 推送# 推送到 Docker Hubdocker push yourusername/myapp:v1# 推送到私有仓库docker push myregistry.example.com/team/project:v2
1、从构建到共享镜像的完整步骤:# 1. 构建镜像docker build -t myapp:v1 .# 2. 标记镜像(准备推送)docker tag myapp:v1 yourusername/myapp:v1# 3. 登录 Docker Hubdocker login# 4. 推送镜像docker push yourusername/myapp:v1# 5. 其他人拉取镜像docker pull yourusername/myapp:v1