Docker学习一

360 阅读6分钟

Docker 基本体验

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网卡绑定,实现两者通讯。

image.png

如上图所示,创建两个tomcat 容器后两者通过Docker0桥接的方式进行联通。此时通过下方的命令可以看到,容器中包含了tomcat1和tomcat2。

docker network inspect bridge

image.png

创建自定义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名称`

image.png

如上图,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