安装Docker
环境准备
- 需要Linux的基础
- CentOS7
- 我们使用Xshell连接远程服务器的操作
环境查看
# 系统内核是 3.10以上
[root@iZ8vbhx84zmjw0g820swhhZ ~]# uname -r
3.10.0-1062.18.1.el7.x86_64
#系统版本
[root@iZ8vbhx84zmjw0g820swhhZ ~]# 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"
安装
帮助文档:
#1、卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2、安装基本的环境(安装包)
yum install -y yum-utils
#3、设置镜像的仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 默认是国外的,十分慢(不推荐)
# 阿里云的镜像的地址
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#4、更新软件包索引
[root@iZ8vbhx84zmjw0g820swhhZ ~]# yum makecache fast
#5、安装docker docker-ce 社区版 ee 企业版
yum install docker-ce docker-ce-cli containerd.io
#6、启动docker
systemctl start docker
#7、使用 docker version 判断是否安装成功
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker version
# 8、测试hello-word
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:5122f6204b6a3596e048758cabba3c46b1c937a46b5be6225b835d091b90e46c
Status: Downloaded newer image for hello-world:latest
#9、查看一下下载的这个 hello-world的镜像
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 3 months ago 13.3kB
卸载docker
# 1、卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2、删除资源
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
# /var/lib/docker docker的默认工作路径
阿里云镜像加速
镜像加速地址
配置和使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ojwsmn7h.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker Run的运行流程图
底层原理
docker是怎么工作的?
Docker是一个Client-Serve结构的系统,Docker的守护运行在主机上。
通过Socket从客户端访问。
DockerServer接收到Docker-Client的指令,就会执行这个命令!
Docker的常用命令
帮助命令
docker version # 显示docker版本信息
docker info # 显示docker系统信息 包括镜像和容器
docker 命令 --help #万能命令
touch test.java # 在当前文件夹下创建java文件
service docker start #docker启动
sudo service docker restart # 重启docker
service docker stop #关闭docker
帮助文档地址
https://docs.docker.com/engine/reference/commandline/restart/
镜像命令
docker images 查看所有本地的主机上的镜像
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 3 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
Options:
-a, --all #列出所有的镜像
-q, --quiet #只显示镜像的id
docker search搜索镜像
# 帮助命令 docker search --help
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker search mysql
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
# 可选项 ,通过搜索收藏来过滤
--filter=STARS=3000 #搜索出来的镜像就是STARS大于3000的
docker pull 下载镜像
# 下载镜像 docker pull 镜像名[:tag]
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker pull mysql
Using default tag: latest # 如果不写tag,默认就是latest
# 等价于它
docker pull mysql
docker pull docker.io/library/mysql:latest
#指定版本下载
docker pull mysql:5.7
docker pull docker.io/library/mysql:5.7
docker rmi 删除镜像
docker rmi -f 容器id # 删除指定的镜像
docker rmi -f 容器id 容器id # 删除多个的镜像
docker rmi -f $(docker images -aq) # 删除全部的镜像
容器命令
说明:我们有了镜像才可以创建容器
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="Name" 容器名字 eg:tomact1,用来区分容器
--d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口
容器端口
-P 随机指定端口
# 测试,启动并进入容器
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker run -it centos /bin/bash
[root@b8341e79e202 /]# ls #查看容器的centos
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#从容器中退回主机
[root@b8341e79e202 /]# exit
exit
列出所有运行中的容器
# docker ps 命令 # 列出当前正在运行的容器
-a #列出当前正在运行的容器 + 带出历史运行过的容器
-n=? # 显示最近创建的容器
-q #只显示容器编号
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b8341e79e202 centos "/bin/bash" 5 minutes ago Exited (0) 3 minutes ago sleepy_black
f97a21b12a0e hello-world "/hello" About an hour ago Exited (0) About an hour ago kind_bouman
[root@iZ8vbhx84zmjw0g820swhhZ ~]#
退出容器
exit # 直接容器停止并退出
Ctrl + P + Q # 容器不停止退出
删除容器
docker rm 容器id # 删除指定的容器 不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq) # 删除所有的容器
启动和停止容器的操作
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行容器
docker kill 容器id # 干掉容器
常用其他命令
后台启动容器
# 命令
docker run -d centos
# 问题,docker ps,发现 centos停止了
# docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# ngnix,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
docker logs --help
# 显示日志
-tf # 显示日志,格式化日期
--tail # 显示日志条数
docker logs -tf --tail 100 容器id
查看容器中的进程
# 查看容器内部的进程信息
# 命令
docker top 容器id
# 测试
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker top 97d64b77809b
UID PID PPID C STIME TTY TIME CMD
root 2001 1980 0 17:18 pts/0 00:00:00 /bin/bash
查看镜像的元数据
# 命令
docker inspect 容器id
# 测试
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker inspect 97d64b77809b
进入当前正在运行的容器
# 我们通常容器都是使用后台方式执行的,需要进入容器,修改一些配置
#命令 方式一
docker exec -it 容器id /bin/bash
#测试
docker exec -it 97d64b77809b /bin/bash
# 方式二
docker attach 容器id
# 测试
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker attach 97d64b77809b
#docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach #进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 主机路径
# 97d64b77809b 为容器id
# /home/kuangshen.java 为容器内的路径
# /home 为容器外路径
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker cp 97d64b77809b:/home/kuangshen.java /home
[root@iZ8vbhx84zmjw0g820swhhZ ~]# ls
Docker的commit镜像
commit镜像
docker commit -a "作者信息" -m "注释信息" 容器id 新的镜像名称:版本号
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!
DockerFile镜像制作
注意:每一行dockerfile命令就是一层,镜像由一层一层而组成
FROM centos # 基础镜像
MAINTAINER wupan<504705281@qq.com> #作者信息
ENV MYPATH /usr/local # 配置工作目录(环境变量配置)
WORKDIR $MYPATH # 引入工作目录地址
RUN yum -y install vim # 添加镜像命令
RUN yum -y install net-tools # 添加镜像命令
EXPOSE 89 # 暴露端口
CMD echo $MYPATH # 输出日志
CMD echo "-----end-----"
CMD /bin/bash
实战
nginx启动和部署
# 下载nginx镜像
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker pull nginx
Using default tag: latest
# 启动nginx镜像
# -d 后台方式启动
# --name 别名
# -p 外网端口:容器内端口
# nginx 容器名称
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker run -d --name nginx01 -p 3344:80 nginx
4343711a1db7c52d14dd57c8ebc1d907fcd54d33b3bd129854daaff8b4685501
# 验证是否创建成功
[root@iZ8vbhx84zmjw0g820swhhZ ~]# curl localhost:3344
# 进入nginx容器
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker exec -it nginx01 /bin/bash
# 查找nginx文件
root@4343711a1db7:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
# 进入nginx配置文件
root@4343711a1db7:/# cd /etc/nginx
端口暴露
-p 进行映射端口
tomcat启动和部署
# 下载镜像
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker pull tomcat
Using default tag: latest
# 启动运行
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker run -d --name tomcattest01 -p 3346:8080 tomcat
# 运行测试
[root@iZ8vbhx84zmjw0g820swhhZ ~]# curl localhost:3346
# 进入容器
[root@iZ8vbhx84zmjw0g820swhhZ ~]# docker exec -it tomcattest01 /bin/bash
# 发现问题:
# 1. linux命令少了;2. 没有webapps。阿里云镜像的原因,默认为最小的镜像,所有不必要的都剔除掉了,保证最小单位可运行的环境
docker工作常用命令
#Linux反选删除文件
shopt -s extglob (打开extglob模式)
rm -fr !(file1)
#解压到当前目录:
# (解压zip)
unzip -o ROOT.zip -d .
# (解压tar.gz)
tar zxvf pythontab.tar.gz
#文件重命名
mv broker ROOT
#删除目录:
rm -rf 文件名
# 复制单个文件:
cp 原文件 目标文件
(cp broker.zip /app/sinitek/sirm/tomcat/webapps/ROOT.zip)
# 复制文件的所有文件到另一个文件夹
cp -r /data/file/* /data/newfile/
#创建目录
mkdir new_catalogue
#创建文件
touch newfile.txt
#修改文件(同时可以创建文件)
vim Dockerfile
# 查看网络地址
ip addr
#删除所有未运行的容器(已经运行的删除不了,未运行的就一起被删除了)
sudo docker rm $(sudo docker ps -a -q)
#根据容器的状态,删除Exited状态的容器
sudo docker rm $(sudo docker ps -qf status=exited)
unzip参数解析
语法:unzip [选项] 压缩包名
选项 含义
-d 目录名 将压缩文件解压到指定目录下。
-n 解压时并不覆盖已经存在的文件。
-o 解压时覆盖已经存在的文件,并且无需用户确认。
-v 查看压缩文件的详细信息,包括压缩文件中包含的文件大小、文件名以及压缩比等,但并不做解压操作。
-t 测试压缩文件有无损坏,但并不解压。
-x文件列表 解压文件,但不包含文件列表中指定的文件。
Docker总结
原目标 | 操作 | 结果 |
---|---|---|
dockerfile | build | images |
containers | commit | images |
images | push | github |
Docker网络
查看docker网络地址
[root@iZ8vbhx84zmjw0g820swhhZ ~]# 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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 10
link/ether 00:16:3e:0b:d9:52 brd ff:ff:ff:ff:ff:ff
inet 172.17.55.90/20 brd 172.17.63.255 scope global dynamic eth0
valid_lft 314755056sec preferred_lft 314755056sec # 阿里云内网地址
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:b7:eb:d3:8a brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global docker0
valid_lft forever preferred_lft forever # docker0地址
查看docker中tomcat容器内的ip地址
# 启动一个tomcat,查看内部网络地址
# 容器启动的时候会得到一个eth0@if79,docker分配的
[root@iZ8vbhx84zmjw0g820swhhZ /]# docker exec -it tomact01 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
78: eth0@if79: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
# liunx可以ping通docker容器内部
[root@iZ8vbhx84zmjw0g820swhhZ /]# ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.089 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.063 ms
64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from 172.18.0.2: icmp_seq=4 ttl=64 time=0.055 ms
64 bytes from 172.18.0.2: icmp_seq=5 ttl=64 time=0.055 ms
64 bytes from 172.18.0.2: icmp_seq=6 ttl=64 time=0.054 ms
64 bytes from 172.18.0.2: icmp_seq=7 ttl=64 time=0.051 ms
原理
1、每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个docker0桥接模式,使用的技术就是evth-pair
# 我们发现容器带来的网卡,都是一对对的
# evth-pair 就是一堆虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
# 正因为有这个特性,evth-pair 充当一个桥梁,连接各种虚拟网络设备
2、容器和容器之间是可以互相ping通的
[root@iZ8vbhx84zmjw0g820swhhZ /]# docker exec -it tomact01 ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.076 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.069 ms
64 bytes from 172.18.0.3: icmp_seq=3 ttl=64 time=0.092 ms
docker网络连接图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FVmY4kWD-1631955176510)(docker的安装和部署.assets/image-20210828172947040.png)]
结论:tomcat01 和 tomcat02 是公用一个路由器:docker0
所有容器不指定网络的情况下,都是docker0路由的,docker会给我们容器分配一个默认的可用ip
只要容器删除,对应的网桥一对就没了
自定义网络
# 自定义网络
# --driver bridge
# subnet 192.168.0.0/16 子网
# gateway 192.168.0.1 网关
[root@iZ8vbhx84zmjw0g820swhhZ /]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
96355b995bf2a69646cb45bcd4b263235f62e72deacb3ea69b3126a971bf7a33
[root@iZ8vbhx84zmjw0g820swhhZ /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
2b2ed90e4cda bridge bridge local
1b7530143478 host host local
96355b995bf2 mynet bridge local
4cdc6d1bde99 none null local
[root@iZ8vbhx84zmjw0g820swhhZ /]# docker network inspect 96355b995bf2
[
{
"Name": "mynet",
"Id": "96355b995bf2a69646cb45bcd4b263235f62e72deacb3ea69b3126a971bf7a33",
"Created": "2021-08-28T18:46:01.097660701+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
自定义网络支持通过名称来ping
[root@iZ8vbhx84zmjw0g820swhhZ /]# docker exec -it 615565aba94a ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.076 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.089 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.070 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.070 ms
^C
--- tomcat-net-01 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 7ms
rtt min/avg/max/mdev = 0.070/0.076/0.089/0.009 ms
我们自定义的网络docker都已经帮我们维护好了对应的关系
网络联通
[root@iZ8vbhx84zmjw0g820swhhZ /]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
--alias strings Add network-scoped alias for the container
--driver-opt strings driver options for the network
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--link list Add link to another container
--link-local-ip strings Add a link-local address for the container
# 将容器73bb68a39466加入到网段mynet01中
[root@iZ8vbhx84zmjw0g820swhhZ /]# docker network connect mynet01 73bb68a39466
iZ8vbhx84zmjw0g820swhhZ /]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
–alias strings Add network-scoped alias for the container
–driver-opt strings driver options for the network
–ip string IPv4 address (e.g., 172.30.100.104)
–ip6 string IPv6 address (e.g., 2001:db8::33)
–link list Add link to another container
–link-local-ip strings Add a link-local address for the container
将容器73bb68a39466加入到网段mynet01中
[root@iZ8vbhx84zmjw0g820swhhZ /]# docker network connect mynet01 73bb68a39466