操作系统 | 配置 | 主机名 | IP |
---|---|---|---|
CentOS 7.9 | 2C4G | docker | 192.168.93.101 |
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
hostnamectl set-hostname docker
# 安装依赖环境
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加CentOS官方镜像站
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum clean all && yum makecache
# 安装Docker
yum -y install docker-ce docker-ce-cli containerd.io
# 启动Docker
systemctl start docker
systemctl enable docker
cd /etc/docker/
cat >> daemon.json << EOF
{
"registry-mirrors": ["https://8xpk5wnt.mirror.aliyuncs.com"]
}
EOF
systemctl restart docker
[root@docker-01 ~]# docker version
Client: Docker Engine - Community
Version: 26.1.2
API version: 1.45
Go version: go1.21.10
Git commit: 211e74b
Built: Wed May 8 14:01:02 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 26.1.2
API version: 1.45 (minimum version 1.24)
Go version: go1.21.10
Git commit: ef1912d
Built: Wed May 8 13:59:55 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.31
GitCommit: e377cd56a71523140ca6ae87e30244719194a521
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
# 搜索nginx镜像
[root@docker-01 ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 19821 [OK]
## 部分内容省略
# 回显含义如下
NAME:镜像名称
DESCRIPTION:描述
STARS:星级
OFFICIAL:是否官方创建 [OK]字样表示官方创建
# 如果下载镜像时,不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为latest标签
# 下载最新的nginx镜像
[root@docker-01 ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
b0a0cf830b12: Pull complete
4d84de5fb9b2: Pull complete
2818b7b6a9db: Pull complete
1e5314d67f16: Pull complete
8066e07ce4f2: Pull complete
05f7109fea9e: Pull complete
e58cbd904f7f: Pull complete
Digest: sha256:32e76d4f34f80e479964a0fbd4c5b4f6967b5322c8d004e9cf0cb81c93510766
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
# 镜像文件是由若干层(Layer)组成,称之为AUFS(联合文件系统)
[root@docker-01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 1d668e06f1e5 7 days ago 188MB
# 回显含义如下
REPOSITORY:镜像属于的仓库
TAG:镜像的标签信息,标记同一个仓库中的不同镜像
IMAGE ID:镜像的唯一ID号,唯一标识一个镜像
CREATED:镜像创建时间
SIZE:镜像大小
[root@docker-01 ~]# docker inspect 1d668e06f1e5
[
{
"Id": "sha256:1d668e06f1e534ab338404ba891c37d618dd53c9073dcdd4ebde82aa7643f83f",
"RepoTags": [
"nginx:latest"
],
[root@docker-01 ~]# docker tag nginx:latest nginx_test:1.0
[root@docker-01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 1d668e06f1e5 7 days ago 188MB
nginx_test 1.0 1d668e06f1e5 7 days ago 188MB
# 例如删除掉刚刚打的新标签nginx_test:1.0
[root@docker-01 ~]# docker rmi nginx_test:1.0
Untagged: nginx_test:1.0
# 当使用docker rmi 命令后面制定了某个镜像ID时,必须确保该镜像当前没有被任一容器使用才能进行删除,系统会先删除掉所有指定该镜像的所有标签,然后删除该镜像文件本身。如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再次删除镜像
# 例如:将本地nginx镜像存出
[root@docker-01 ~]# docker save -o nginx_latest.tar nginx:latest
# 存出镜像后就可以使用scp命令将存出的文件复制到其他机器上了
# 两种方式任选一个
[root@docker-02 ~]# docker load < nginx_latest.tar
[root@docker-02 ~]# docker load -i nginx_latest.tar
# 常用选项
-i:让容器的输入保持打开
-t:让docker分配一个伪终端
--name:指定容器的名称,如果不加的话容器名称是随机生成的
[root@docker-01 ~]# docker create -it --name myname nginx:latest bash
3cbd2bbf3cb0dddc7c8edd8730723d491606509587e7b6811a951dff16197262
# 使用docker create命令创建新的容器后会返回一个唯一的ID。可以使用docker ps命令查看所有容器的运行状态。添加-a选项可以显示所有的容器。包括为运行的
[root@docker-01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3cbd2bbf3cb0 nginx:latest "/docker-entrypoint.…" About a minute ago Created myname
# 回显含义如下
CONTAINER ID:容器的ID
IMAGE:加载的镜像
COMMAND:运行的程序
CREATED:创建容器的时间
STATUS:目前容器所处的状态
PORTS:端口映射
NAMES:容器的名称
[root@docker-01 ~]# docker start myname
myname
[root@docker-01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3cbd2bbf3cb0 nginx:latest "/docker-entrypoint.…" 6 minutes ago Up 11 seconds 80/tcp myname
# 启动容器后,STATUS状态变成了UP状态,表示容器已经处于启动状态
注意:容器是一个与其中运行的shell命令共存亡的终端,命令运行容器运行,命令结束容器退出
命令格式:docker run
# 当利用docker run来创建容器时,docker在后台的标准运行过程是
1.检查本地是否存在指定的镜像。当镜像不存在时,会从公共仓库下载
2.利用镜像创建并启动一个容器
3.分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层
4.从宿主机主机配置的往前接口中桥接一个虚拟机接口到容器中
5.分配一个地址池中的IP地址给容器
6.指定用户指定的应用程序,指定完毕后容器被终止运行
# 例如:创建容器并启动执行一条shell命令
[root@docker-01 ~]# docker run centos:7.6.1810 bash -c ls /
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 执行一下命令可以看出容器在执行"/usr/bin/bash -c ls"命令之后就停止了,有时候需要在后台持续的运行这个容器,就需要让docker容器以守护形式在后台运行。可以在docker run 命令之后添加-d选项来实现。但是需要注意容器所运行的程序不能结束,容器执行的命令一旦借宿那么容器也就推出了
[root@docker-01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a3739391e27 centos:7.6.1810 "bash -c ls /" 30 seconds ago Exited (0) 28 seconds ago mystifying_euler
3cbd2bbf3cb0 nginx:latest "/docker-entrypoint.…" 15 minutes ago Up 10 minutes 80/tcp myname
# 例如:下面的容器会在后台运行30秒后终止
[root@docker-01 ~]# docker run -itd centos:7.6.1810 bash -c "sleep 30"
1d414b78bbe5ba48b466dba497f7b9645d45f302c946fda7376be18c96f562ef
[root@docker-01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1d414b78bbe5 centos:7.6.1810 "bash -c 'sleep 30'" 13 seconds ago Up 12 seconds clever_haibt
# 例如:下面的容器会一直运行
[root@docker-01 ~]# docker run -itd centos:7.6.1810 bash -c "while true;do echo hello;done"
88b7043a5b75ad0f3ce1ed60f591a52a79c4ce4f4fe97f30fa23b7ebc498bec2
[root@docker-01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
88b7043a5b75 centos:7.6.1810 "bash -c 'while true…" 11 seconds ago Up 10 seconds hopeful_black
# 创建容器的时候可以根据需求添加一些选项,常用的选项有
--rm:容器退出时自动删除容器
--name:指定容器的名字
-p:8080:80将宿主机的8080端口映射到容器的80端口(也就意味着如果访问虚拟机的8080端口就相当于访问容器的80端口)
-P:随机映射端口号
[root@docker-01 ~]# docker run -d --rm --name mynginx -P nginx:latest
f0e99cfa10c1ae1c77bb6600ea5945583d24c89393d24f6ac05523d146118a81
[root@docker-01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f0e99cfa10c1 nginx:latest "/docker-entrypoint.…" 17 seconds ago Up 16 seconds 0.0.0.0:32768->80/tcp, :::32768->80/tcp mynginx
[root@docker-01 ~]# docker run -d --rm --name myningx_01 -p 8080:80 nginx:latest
d135e4786cff67951cfea1666424b91f29298ad53b7e92efa42560ce1e88a2f5
[root@docker-01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d135e4786cff nginx:latest "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp myningx_01
# 查看容器端口转发情况
[root@docker-01 ~]# docker port a07b19ffc4b1
80/tcp -> 0.0.0.0:85
80/tcp -> [::]:85
[root@docker-01 ~]# docker stop myname
myname
[root@docker-01 ~]# docker ps -a
3cbd2bbf3cb0 nginx:latest "/docker-entrypoint.…" 33 minutes ago Exited (137) 22 seconds ago myname
[root@docker-01 ~]# docker exec -it mynginx /bin/bash
# 执行exit可以退出容器
root@f0e99cfa10c1:/# exit
exit
# 导出mynginx容器到文件mynginx.tar
[root@docker-01 ~]# docker export mynginx > mynginx.tar
[root@docker-01 ~]# ls -lh mynginx.tar
-rw-r--r-- 1 root root 182M May 10 22:26 mynginx.tar
# 可以直接scp把刚刚导出的容器镜像上传到其他机器上验证效果
[root@docker-02 ~]# cat mynginx.tar | docker import - mynginx:1.0
sha256:dc71be6ceabdf4508ef245c3b5bf750f7d135a0ce15c1574c842c3606c4a0e2f
[root@docker-02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx 1.0 dc71be6ceabd 3 seconds ago 186MB
[root@docker-01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e57cb74fc0e2 nginx:latest "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 80/tcp myname
[root@docker-01 ~]# docker rm myname
myname
[root@docker-01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 例如:使用nginx:latest镜像创建一个名为web的容器,并且创建两个数据卷分别挂载到/data1和/data2目录上
[root@docker-01 ~]# docker run -d -v /data1 -v /data2 --name web nginx:latest8aa51caf3fa61d260a6fb22766fe02e1f7e6bbefa07feb80592df567ef34b3ea
[root@docker-01 ~]# docker exec -it web bash
root@8aa51caf3fa6:/# ls -l
drwxr-xr-x 2 root root 6 May 11 03:20 data1
drwxr-xr-x 2 root root 6 May 11 03:20 data2
# 例如:使用nginx:latest镜像创建一个名为web-1容器,并且将宿主机的/var/www目录挂载到容器的/data1目录上
[root@docker-01 ~]# docker run -d -v /var/www/:/data1 --name web-1 nginx:latest
fad85d0b53956f198a560075adf9615b6d8f95aed8ed8cd233917f905aadf0bd
[root@docker-01 ~]# touch /var/www/test.html
[root@docker-01 ~]# docker exec -it web-1 bash
root@fad85d0b5395:/# ls /data1/
test.html
# 例如:使用前面预先创建好的数据卷容器web。其中所创建的数据卷分别挂载到/data1与/data2目录上,使用--volumes-from来挂载web容器中的数据卷到新的容器,新的容器名为db1
[root@docker-01 ~]# docker run -it --volumes-from web --name db1 nginx:latest bash
root@42e73d8ccca5:/# touch /data1/hello.txt
root@42e73d8ccca5:/# exit
exit
d[root@docker-01 ~]# docker exec -it web bash
root@8aa51caf3fa6:/# ls /data1
hello.txt
# 将容器旧日志打到屏幕上
[root@docker-01 ~]# docker logs 8567f02c60b6
# 实时查看容器日志
[root@docker-01 ~]# docker logs -f 8567f02c60b6
# 结合管道符查看后10行容器日志
[root@docker-01 ~]# docker logs 8567f02c60b6 | tail -10
# 查看容器详细信息,用于高级的调试
[root@docker-01 ~]# docker container inspect 8567f02c60b6
# 提交的容器当中已经是提前安装好了vim编辑器的容器,把它提交为yuchao163/centos-vim-7.8.2003镜像,当用这个镜像创建新的容器时,将自带vim编辑器
[root@docker-01 ~]# docker commit 5de8a1c1f640 yuchao163/centos-vim-7.8.2003