Docker
——Docker——
Docker基本组成
镜像(image):
容器(container):
仓库(registry):
Docker安装
环境查看
#系统内核
[root@localhost ~]# uname -r
#系统版本
[root@localhost ~]# cat /etc/os-release
安装Docker
卸载旧版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
使用Docker仓库进行安装
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。
#安装所需的软件包。
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
使用以下命令来设置稳定的仓库。
#阿里云
$ sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#清华大学源
$ sudo yum-config-manager \
--add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
安装 Docker Engine-Community
$ sudo yum install docker-ce docker-ce-cli containerd.io
启动Docker
$ sudo systemctl start docker
运行镜像来验证是否正确安装了 Docker Engine-Community
$ sudo docker run hello-world
#查看镜像
[root@localhost ~]# docker images
卸载Docker
# 删除安装包
[root@localhost ~]# yum remove docker-ce
# 删除镜像、容器、配置文件等内容
[root@localhost ~]# rm -rf /var/lib/docker
阿里云镜像加速
[root@localhost ~]# sudo mkdir -p /etc/docker
[root@localhost ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://tqku2lxe.mirror.aliyuncs.com"]
}
EOF
[root@localhost ~]# sudo systemctl daemon-reload
[root@localhost ~]# sudo systemctl restart docker
Docker run的运行流程
Docker常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker --help #帮助命令
服务命令
systemctl start docker #启动docker服务
systemctl stop docker #停止docker服务
systemctl restart docker #重启docker服务
systemctl status docker #查看docker服务状态
systemctl enable docker #设置开机启动docker服务
—镜像命令—
docker images 查看所有本地的主机上的镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选参数
Options:
-a, --all # 列出所有镜像
-q, --quiet # 只显示镜像id
docker search 搜索镜像
[root@localhost ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12431 [OK]
mariadb MariaDB Server is a high performing open sou… 4790 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 918 [OK]
percona Percona Server is a fork of the MySQL relati… 575 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 509 [OK]
...
#解释
NAME 镜像仓库源的名称
DESCRIPTION 镜像的描述
STARS
OFFICIAL 镜像是否由docker官方发布
AUTOMATED 自动构建
#可选参数,通过收藏来过滤
Options:
--filter=STARS=3000 # 过滤出收藏数大于3000的镜像
docker pull 下载镜像
#下载镜像 docker pull 镜像名:tag(版本号)
[root@localhost ~]# docker pull mysql
Using default tag: latest # 如果不写tag,默认为latest
latest: Pulling from library/mysql
f003217c5aae: Pull complete # 分层下载,docker image的核心 联合文件系统
65d94f01a09f: Pull complete
43d78aaa6078: Pull complete
a0f91ffbdf69: Pull complete
59ee9e07e12f: Pull complete
04d82978082c: Pull complete
70f46ebb971a: Pull complete
db6ea71d471d: Pull complete
c2920c795b25: Pull complete
26c3bdf75ff5: Pull complete
9ec1f1f78b0e: Pull complete
4607fa685ac6: Pull complete
Digest: sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
docker rmi 删除镜像
[root@localhost ~]# docker rmi -f IMAGE ID #删除指定镜像
[root@localhost ~]# docker rmi -f $(docker images -aq) #删除全部镜像
——容器命令——
说明:有了镜像才可以创建容器
[root@localhost ~]# docker pull centos
docker run 新建容器
[root@localhost ~]# docker run [可选参数] REPOSITORY:TAG
#参数说明
--name Name # 为容器创建名字,为Name,用来区分容器
-i # 保持容器运行
-d # 后台模式运行容器,需要使用docker exec进入容器,exit退出后,容器不关闭
-p 3355:8080 # 暴露端口,将容器外部的3355端口给容器内部的8080做一个映射,就可以通过外部的3355就能访问8080的内容
-it # 创建交互式容器,创建后自动进入容器中,exit退出容器后,容器自动关闭
# 退出容器 exit 报错There are stopped jobs.
[root@837ada2549cc /]# jobs -l
[1]+ 15 Stopped ping www.baidu.com
[root@837ada2549cc /]# kill %1
[1]+ Stopped ping www.baidu.com
[root@837ada2549cc /]# jobs -l
[1]+ 15 Terminated ping www.baidu.com
[root@837ada2549cc /]# exit
exit
[root@localhost ~]#
docker ps 查看容器
[root@localhost ~]# docker ps [可选参数]
CONTAINER ID
#解释
#参数说明
-a #查看所有容器
docker exec 进入容器
[root@localhost ~]# docker exec -it NAME /bin/bash
docker stop 停止容器
[root@localhost ~]# docker stop CONTAINER ID/NAMES
docker start 启动容器
[root@localhost ~]# docker start CONTAINER ID/NAMES
docker rm 删除容器
[root@localhost ~]# docker rm CONTAINER ID # 删除指定容器
[root@localhost ~]# docker rm -f $(docker ps -aq) # 删除所有容器
查看指定容器的ip地址
[root@localhost ~]# docker inspect CONTAINER ID | grep IPAddress
查看下载容器信息
[root@localhost ~]# docker logs CONTAINER ID
!注意:
操作命令
——Docker应用部署——
部署MySQL
搜索
拉取
创建容器,设置端口映射,目录映射
mkdir mysql
cd mysql
docker run -id \
-p 3307:3306 \ #将容器的3306端口映射到宿主机的3307端口
--name= \
-v $PWD/conf:/etc/mysql/conf.d \ #conf 配置目录,将宿主机当前目录下的conf目录挂载到容器/etc/mysql/conf.d目录
-v $PWD/logs:logs \ #logs 日志目录,将宿主机当前目录下的logs目录挂载到容器logs目录
-v $PWD/data:/var/lib/mysql \ #data 数据目录,将宿主机当前目录下的data目录挂载到容器/var/lib/mysql目录
-e MYSQL_ROOT_PASSWORD= \ #初始化root用户的密码
mysql:TAG
部署tomcat
下载
[root@localhost ~]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
0e29546d541c: Pull complete
9b829c73b52b: Pull complete
cb5b7ae36172: Pull complete
6494e4811622: Pull complete
668f6fcc5fa5: Pull complete
dc120c3e0290: Pull complete
8f7c0eebb7b1: Pull complete
77b694f83996: Pull complete
0f611256ec3a: Pull complete
4f25def12f23: Pull complete
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
创建容器并运行
[root@localhost ~]# docker run -d -p 3355:8080 --name tomcat01 tomcat
deca8a17fd09776666adb8e93bdec6751ecaadb466f440d1243d50126ac1b5f6
# 参数说明
-d # 后台运行
-p 3355:8080 #
--name tomcat01 #
进入
[root@localhost ~]# docker exec -it tomcat01 /bin/bash
# 测试
root@deca8a17fd09:/usr/local/tomcat# cp -r webapps.dist/* webapps
# 访问tomcat
http://192.168.88.128:3355/
退出容器
root@deca8a17fd09:/usr/local/tomcat# exit
exit
搭建minio
拉取镜像
[root@localhost ~]# docker pull minio/minio
创建Minio外部挂载的配置文件和存储上传文件的目录
[root@localhost ~]# mkdir -p /docker/minio/config
[root@localhost ~]# mkdir -p /docker/minio/data
创建minio容器并运行
docker run -p 9000:9000 \ # 将容器的9000端口映射到宿主机的9000端口
--name minio \
-d --restart=always \ # 保证每次docker服务重启后容器也自动重启
-e "MINIO_ACCESS_KEY=minio" \ # 账号长度必须大于等于5
-e "MINIO_SECRET_KEY=12345678" \ # 密码长度必须大于等于8位
-v /docker/minio/data:/data \
-v /docker/minio/config:/root/.minio \
minio/minio server \
/data # --console-address ":9090" -address ":9000"
查看
[root@localhost ~]# docker ps -a
[root@localhost ~]# docker logs CONTAINER ID
访问
console ip
Docker镜像
容器数据卷
DockerFile
Docker网络
linux 可以ping通 docker容器内部
原理
1.每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术
evth-pair技术就是一对虚拟设备接口,一端连接协议,一端彼此相连
evth-pair充当桥梁,连接各种虚拟网络设备
容器与容器之间是可以互相ping通
自定义网络
容器互联
docker network --help
# 可选参数
Options:
-connect # 连接一个容器到一个网络
-create
-inspect #
-ls #
-rm
# 查看所有的docker网络
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
751a808661e2 bridge bridge local
4d30468b497e host host local
9d32359065d7 none null local
# 解释
NETWORK ID
NAME
DRIVER
SCOPE
网络模式
bridge:桥接 docker(默认)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通(用的少,局限很大)
# 直接启动容器有个默认的命令 --net bridge,这就是docker0
[root@localhost ~]# docker run -d -P -- name tomcat01 tomcat
[root@localhost ~]# docker run -d -P -- name tomcat01 --net bridge tomcat
# docker0特点:默认,域名不能访问, --link可以打通连接,但不能反向连通
# 自定义一个网络
# --driver bridge
# --subnet 192.168.0.0/16
# --gateway 192.168.0.1
[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# 可选参数
Options:
--driver
--subnet # 子网
--gateway # 网关
网络连通
# 内部
[root@localhost ~]# docker network connect mynet tomcat01
# 将tomcat01 放到了 mynet 网络下
# 一个容器两个ip地址,例如:阿里云服务 公网ip 私网ip
# 可选参数
Options:
--
IP地址 | 子网 | ||
---|---|---|---|
主机1 | 192.168.145.128 | 主机1的docker0 | 172.17.1.0/24 |
主机2 | 192.168.145.129 | 主机2的docker0 | 172.17.2.0/24 |
分别对主机1和主机2上的docker0进行配置
[root@localhost ~]# vim /etc/docker/daemon.json
#主机1
{
"bip": "172.17.1.252/24"
}
#主机2
{
"bip": "172.17.2.252/24"
}
**!注意:**配置完记得重启docker网络服务
[root@localhost ~]# systemctl restart docker
添加路由规则
#主机1
[root@localhost ~]# route add -net 172.17.2.0 netmask 255.255.255.0 gw 192.168.145.129
#主机2
[root@localhost ~]# route add -net 172.17.1.0 netmask 255.255.255.0 gw 192.168.145.128
配置iptables规则
#主机1
[root@localhost ~]# iptables -t nat -F POSTROUTING
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 172.17.1.0/24 ! -d 172.17.0.0/16 -j MASQUERADE
#主机2
[root@localhost ~]# iptables -t nat -F POSTROUTING
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 172.17.2.0/24 ! -d 172.17.0.0/16 -j MASQUERADE
启动容器
IDEA整合Docker
Docker Compose
Docker Swarm集群部署
Docker报错处理
Job for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “journalctl -xe” for details.
WARNING:IPv4 forwarding is disabled. Networking will not work.
# 配置转发
[root@localhost ~]# vi /etc/sysctl.conf
# 添加net.ipv4.ip_forward=1
# 重启网络服务
[root@localhost ~]# systemctl restart network
[root@localhost ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
# 重启docker服务
[root@localhost ~]# service docker restart
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get “http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?all=1”: dial unix /var/run/docker.sock: connect: permission denied
# 查看docker用户组
[root@localhost ~]# grep 'docker' /etc/group
# 将当前用户添加至docker用户组
[root@localhost ~]# sudo gpasswd -a $USER docker
# 更新docker用户组
[root@localhost ~]# newgrp docker