Docker 基本体验
安装步骤
准备好Centos7环境。
卸载之前的Docker环境(初次安装可跳过)。
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
03 安装必要的依赖
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
{
"registry-mirrors": ["tjg5f9l5.mirror.aliyuncs.com"]
}
04 设置docker仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
访问这个地址,使用自己的阿里云账号登录,查看菜单栏左下角,发现有一个镜像加速器
配置自己的Docker加速器
找到/etc/docker目录下的daemon.json文件,没有则直接 vi daemon.json
加入以下配置
填写自己的加速器地址:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": \["<https://pgjhp4wg.mirror.aliyuncs.com>"]
}
EOF
EOFregistry-mirrors": ["tjg5f9l5.mirror.aliyuncs.com"]
通知systemd重载此配置文件;
sudo systemctl daemon-reload
6.重启docker服务
sudo systemctl restart docker
05 安装docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
06 启动docker
sudo systemctl start docker
07 测试docker安装是否成功
sudo docker run hello-world
Docker 基本命令
01 创建tomcat容器
docker pull tomcat
docker run -d --name my-tomcat -p 8080:8080 tomcat
02 创建mysql容器
docker run -d --name my-mysql -p 3301:3306 -e MYSQL_ROOT_PASSWORD=jack123 --privileged mysql
03 进入到容器里面
docker exec -it containerid /bin/bash
04 删除全部容器
docker rm -f $(docker ps -aq)
命令格式
docker pull 拉取镜像到本地
docker run 根据某个镜像创建容器
-d 让容器在后台运行,其实就是一个进程
--name 给容器指定一个名字
-p 将容器的端口映射到宿主机的端口
docker exec -it 进入到某个容器中并交互式运行
docker rm -f containerName 删除某个容器
docker rmi -f dockername + tag 删除某个images
Docker 自定义 Images
Docker自定义 Images 依赖Dockerfile 。
比如要将某个jar包做成Images。在jar包同目录下创建Dockerfile。并编写对应的命令。
然后他通过 docker build -t jar包 . 创建images
Docker 镜像仓库
Docker 与maven类似,支持本地镜像仓库。 可以自行搭建,也可使用阿里云。
Docker Images 命令操作
(1)查看本地image列表
docker images
docker image ls
(2)获取远端镜像
docker pull
(3)删除镜像[注意此镜像如果正在使用,或者有关联的镜像,则需要先处理完]
docker image rm imageid
docker rmi -f imageid
docker rmi -f $(docker image ls) 删除所有镜像
(4)运行镜像
docker run image
(5)发布镜像
docker push
Container 常用命令
(1)根据镜像创建容器
docker run -d --name -p 9090:8080 my-tomcat tomcat
(2)查看运行中的container
docker ps
(3)查看所有的container[包含退出的]
docker ps -a
(4)删除container
docker rm containerid
docker rm -f $(docker ps -a) 删除所有container
(5)进入到一个container中
docker exec -it container bash
(6)根据container生成image
docker commit `containerName` `newImageName`
(7)查看某个container的日志
docker logs container
(8)查看容器资源使用情况
docker stats
(9)查看容器详情信息
docker inspect container
(10)停止/启动容器
docker stop/start container
Dock 网络
每一个Docker容器都是一个不同率的NameSpace。
每个Docker容器之间可以互相通讯,是由于宿主机Centos7上有一个Docker0的网卡。所有的容器创建后通过veth-pair技术,将容器网卡与Docker0网卡绑定,实现两者通讯。
如上图所示,创建两个tomcat 容器后两者通过Docker0桥接的方式进行联通。此时通过下方的命令可以看到,容器中包含了tomcat1和tomcat2。
docker network inspect bridge
创建自定义bridge类型网络
由上可知,Docker创建容器后,默认使用Docker0所属网卡的网段。172.17 ,当我们想要做隔离,或者网段不够用时,可以自行创建网段。
【创建一个名称为 tomcat-net 的网段 】
docker network creat tomcat-net
【查看网段详情】
docker network list
【使用自定义网段允许container】
docker run -d --name tomcat03 -p 8080:8080 --network my-network tomcat
【将某个容器添加到新的网段,添加后即可通讯】
docker network connect `网段名称` `container名称`
如上图,Docker0默认启动两个tomcat容器,然后又新建my-network网段,并使用此网段启动tomcat 03 04。此时 tomcat01 和 tomcat03分属两个不同的网段,无法进行通讯,如果想要通讯,需要将tomcat01添加到my-network网段中去,这时可以使用:docker network connect my-network tomcat01 执行完毕后,tomcat01就会有两个网段的ip地址,便可以访问tomcat03。
使用名称访问
比如,一个SpringBoot应用,需要链接一个Mysql数据库,正常我们需要配置数据库IP地址+端口。那么在Docker环境中,我们需要在容器启动完成之后才知道IP地址,且存在容器IP地址更换情况,我们如果通过IP地址访问,那么会存在较大的风险。
因此就像微服务引入注册中心,使用服务名称请求服务一样,我们也期望通过名称能够通过容器名称链接到数据库容器。
正常情况(使用Docker0作为容器启动网段,是不支持名称访问的),但是如果使用自定义网段,则可以通过容器名称连接。
docker network create tomcat-net;
docker run --name tomcat01 -p 8081:8080 --network tomcat-net tomcat;
docker run --name tomcat02 -p 8082:8080 --network tomcat-net tomcat;
docker exec -it tomcat01 ping tomcat02;
如果一定要通过docker0启动,并想通过名称访问可以使用link方式
docker run --name tomcat01 -p 8081:8080 --network tomcat-net tomcat;
docker run --name tomcat02 -p 8082:8080 --link tomcat01 tomcat;
Docker 的网络模式一共有三种:bridge、Host、null
前边说的都是bridge类型的网络模式。
Host类型的网络模式,表示使用宿主机的ip地址。
Docker 数据持久化
我们在启动mysql容器后,里边的数据是如何做持久化的呢?容器删除后如何保证数据不丢失?如何保证启动新的容器时仍然可以使用之前保存的数据?
这就是依赖Docker的 volume 实现。
初识volume
[查看当前volume信息]
docker volume ls;
[启动mysql数据库]
docker run --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql;
[再次查看volume]
docker volume ls;
这时可以发现,我们启动mysql01后volume多出来了一条数据。这个数据就表示了我们mysql01数据在宿主机上存储的位置。
[查看volume详情信息]
[root@bogon _data]# docker volume inspect mysql-volume
[
{
"CreatedAt": "2022-01-16T09:05:32Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/mysql-volume/_data",
"Name": "mysql-volume",
"Options": null,
"Scope": "local"
}
]
[root@bogon _data]# docker exec -it mysql01 bash
我们可以进入查看到的宿主机下的目录: '/var/lib/docker/volumes/mysql-volume/_data'
在该目录下,创建一个文件。此时会发现docker容器'/var/lib/mysql/'目录下也会出现新建的文件。
自定义volume名称
创建命令:
docker run --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v mysql-volume:/var/lib/mysql -d mysql
使用已存在volume启动
与启动命令一样,如果volume不存在则新建,存在则复用。
docker run --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v mysql-volume:/var/lib/mysql -d mysql
我们登录数据库,新建表、新建数据。之后删除掉容器。再使用上方命令,启动一个新的容器,此时发现数据依然存在。
这里 -v volume-name:/var/lib/mysql,表示的是将容器/var/lib/mysql(mysql数据目录)挂载到本地磁盘,建立两个目录之间的同步关系,这样一来对数据的操作就能即时的存储下来,另外需要注意这个同步是双向的,因此即时容器删除,重启启动一个新的myslq实例,制定这个volume后,也能恢复数据。
具体的磁盘目录可以通过命令:
docker volume inspect mysql01