docker的安装和部署

安装Docker

环境准备
  1. 需要Linux的基础
  2. CentOS7
  3. 我们使用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总结

原目标操作结果
dockerfilebuildimages
containerscommitimages
imagespushgithub

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值