1 Docker的基本使用
1.1 镜像相关操作
1、从DockerHub搜索镜像
[root@master ~]# docker search centos
# 镜像名字 描述 星标 是否官方(有OK表示为官方镜像)
NAME DESCRIPTION STARS OFFICIAL
centos DEPRECATED; The official build of CentOS. 7718 [OK]
kasmweb/centos-7-desktop CentOS 7 desktop for Kasm Workspaces 43
bitnami/centos-base-buildpack Centos base compilation image 0
dokken/centos-7 CentOS 7 image for kitchen-dokken 8
dokken/centos-8 CentOS 8 image for kitchen-dokken 6
spack/centos7 CentOS 7 with Spack preinstalled 2
dokken/centos-6 EOL: CentOS 6 image for kitchen-dokken 0
spack/centos6 CentOS 6 with Spack preinstalled 1
ustclug/centos Official CentOS Image with USTC Mirror 0
dokken/centos-stream-8 5
eclipse/centos_jdk8 CentOS, JDK8, Maven 3, git, curl, nmap, mc, … 5
dokken/centos-stream-9 9
corpusops/centos-bare https://github.com/corpusops/docker-images/ 0
corpusops/centos centos corpusops baseimage 0
spack/centos-stream 2
解释说明:
- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- OFFICIAL: 是否 docker 官方发布
- stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
- AUTOMATED: 自动构建。
在选择镜像时尽量选择官方构建的镜像,其他镜像可能会存在安全隐患。
2、下载镜像
docker pull centos
# 不知道tag时,默认拉取最新版本。
# tag 相当于版本号
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
## 解释:
library:代表官方仓库的意思
3、查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 2 years ago 231MB
参数解释:
- REPOSITORY:镜像名称
- TAG:相当于软件版本
- IMAGE ID:镜像ID,镜像的唯一标识
- CREATED:镜像构建时间
- SIZE:镜像大小
4、把镜像做成离线包/解压离线包
# 压缩成离线包
[root@master ~]# docker save -o centos.tar.gz centos
[root@master ~]# ls
anaconda-ks.cfg centos.tar.gz
# 删除
[root@master ~]# docker rmi centos:latest
Untagged: centos:latest
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
# 此时已经没有镜像了
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# 解压离线包
[root@master ~]# docker load -i centos.tar.gz
74ddd0ec08fa: Loading layer 238.6MB/238.6MB
Loaded image: centos:latest
# 镜像就有了
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 2 years ago 231MB
[root@master ~]#
5、删除镜像
docker rmi centos:latest
docker rmi 5d0da3dc9764
docker rmi -f 5d0da3dc9764
# rmi 后面的参数可以是 镜像名称:TAG ,也可以是 IMAGE ID
# -f:强制执行
1.2 容器相关操作
1、以交互式方式启动并进入容器
[root@master ~]# docker run --name test -it centos:latest /bin/bash
[root@721baa423e43 /]#
# 此时查看正在运行的容器可以看懂
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
721baa423e43 centos:latest "/bin/bash" About a minute ago Up About a minute test
[root@master ~]#
# 输入exit,退出容器,退出之后容器也会停止,不会再前台运行
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@master ~]#
# 解释:
docker run运行并创建容器
--name 容器的名字
-i 交互式
-t 分配伪终端
centos: 启动docker需要的镜像
/bin/bash说明你的shell类型为bash,bash shell是最常用的一种shell, 是大多数Linux发行版默认的shell。 此外还有C shell等其它shell。
2、以守护进程方式启动容器
[root@master ~]# docker run --name test1 -td centos:latest /bin/bash
014b1b3ae7a351f3d20c662b06c9b5078d01aa302a3b0f4a63fd3a127b748e50
[root@master ~]#
# -d在后台运行docker
## 此时查看容器还在运行
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
014b1b3ae7a3 centos:latest "/bin/bash" 59 seconds ago Up 58 seconds test1
[root@master ~]#
# 进入容器
[root@master ~]# docker exec -it test1 /bin/bash
[root@014b1b3ae7a3 /]# exit
exit
# 退出之后容器还在后台运行
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
014b1b3ae7a3 centos:latest "/bin/bash" 2 minutes ago Up 2 minutes test1
[root@master ~]#
3、查看容器
# 查看正在运行的容器
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
014b1b3ae7a3 centos:latest "/bin/bash" 4 minutes ago Up 4 minutes test1
[root@master ~]#
# 输出内容解释:
CONTAINER ID:容器ID
IMAGE:该容器所使用的镜像
COMMAND:容器执行的命令
CREATED:容器创建时间
STATUS:容器的状态
PORTS:暴露端口
NAMES:容器名称
# 这里介绍一个参数:--no-trunc,显示 容器ID、执行的命令等详细信息
[root@master ~]# docker ps --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
014b1b3ae7a351f3d20c662b06c9b5078d01aa302a3b0f4a63fd3a127b748e50 centos:latest "/bin/bash" 8 minutes ago Up 8 minutes test1
[root@master ~]#
# 查看所有容器:包括运行和没有运行的容器
[root@master ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
014b1b3ae7a3 centos:latest "/bin/bash" 5 minutes ago Up 5 minutes test1
721baa423e43 centos:latest "/bin/bash" 9 minutes ago Exited (0) 7 minutes ago test
[root@master ~]#
4、停止容器
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
014b1b3ae7a3 centos:latest "/bin/bash" 9 minutes ago Up 9 minutes test1
[root@master ~]# docker stop test1
test1
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@master ~]#
5、启动已经停止的容器
[root@master ~]# docker start test1
test1
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
014b1b3ae7a3 centos:latest "/bin/bash" 10 minutes ago Up 2 seconds test1
[root@master ~]#
6、删除容器
docker rm test
# 注意:docker rm 只能删除停止运行的容器。如果想要删除正在运行的容器则会报错:Error response from daemon: cannot remove container "/test1": container is running: stop the container before removing or force remove
# 如果想要删除正在运行的容器,则需要加 -f 选项
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
014b1b3ae7a3 centos:latest "/bin/bash" 12 minutes ago Up 2 minutes test1
[root@master ~]# docker rm -f test1
test1
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@master ~]#
7、进入容器
docker exec -it test /bin/bash
# 注意:有时候镜像不支持 /bin/bash 这种shell。可以换成其他的shell,比如 /bin/sh 等。
# 进入容器后退出,使用 exit 命令
[root@master ~]# docker start test
test
[root@master ~]# docker exec -it test /bin/bash
[root@721baa423e43 /]# exit
exit
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
721baa423e43 centos:latest "/bin/bash" 20 minutes ago Up 16 seconds test
[root@master ~]#
8、查看容器日志
# 查看所有日志
docker logs test
# 查看最后保存的20行的内容
docker logs -n 20 test
# 实时刷新,页面总是显示20行内容
docker logs -f -n 20 test
9、查看帮助信息
# 查看docker命令的帮助信息
docker --help
# 查看某个选项的帮助信息
docker logs --help
1.3 通过 docker 部署 nginx 服务
1、启动容器
docker run -itd --name nginx -p 80 centos
### 参数解释
-p:把容器端口随机在物理机随机映射一个端口
--name:容器名称
-t:终端
-d:后台运行容器并输出容器id
-i:即使未连接也保持标准输入(STDIN)开启
2、在容器中安装nginx
# 查看
root@con02:~# docker ps |grep nginx
3e45f4fc0c3b centos "/bin/bash" 4 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp, :::32768->80/tcp nginx
# 进入容器
root@con02:~# docker exec -it nginx /bin/bash
# 可以看到容器的IP为172.17.0.3
[root@3e45f4fc0c3b /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
##### 使用yum 安装 nginx
# 把镜像中的yum源换成阿里源
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
yum update
yum install wget -y
yum install nginx -y
# 大部分镜像都是最小化安装系统,所以需要安装文本编辑器 vim
yum install vim-enhanced -y
# 以下操作和直接操作nginx就是一样的了
# 创建静态页面
mkdir /var/www/html -p
cd /var/www/html/
cat > index.html << EOF
<html>
<head>
<title>nginx in docker</title>
</head>
<body>
<h1>hello,this is a test page !!!</h1>
</body>
</html>
EOF
# 修改 nginx 配置文件中的 root 路径,如下
vim /etc/nginx/nginx.conf
root /var/www/html/;
# 启动 nginx
/usr/sbin/nginx
# 安装net-tools
yum -y install net-tools
# 查看正常启动
netstat -antp
#### 以下是输出内容
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 157/nginx: master p
tcp 0 0 172.17.0.3:40666 116.211.220.239:80 TIME_WAIT -
tcp6 0 0 :::80
# 退出容器
exit
3、查看
docker ps
######### 此时在查看 nginx 容器,端口80映射到32768端口上
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e45f4fc0c3b centos "/bin/bash" 17 minutes ago Up 17 minutes 0.0.0.0:32768->80/tcp, :::32768->80/tcp nginx
netstat -atnp |grep 32768
###### 我们的虚拟机上也存在这个端口
tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN 15092/docker-proxy
tcp6 0 0 :::32768 :::* LISTEN 15100/docker-proxy
#
curl 192.168.92.10:32768
######
<html>
<head>
<title>nginx in docker</title>
</head>
<body>
<h1>hello,this is a test page !!!</h1>
</body>
</html>
# 也可以直接访问容器的 ip:port
# 注意:这种方式只能在和容器相同的服务器上进行访问,如果是其他服务器访问,必须要使用 虚拟机ip:虚拟机映射端口 的方式
curl 172.17.0.3:80
web 页面也可以访问
流量走向:
访问物理节点 ip:port(容器在物理节点映射的端口)→ 容器 ip:port(容器里部署的服务的端口)→ 就可以访问到容器里部署的应用了