环境说明
本文使用centos7.7构建docker。
Docker要求操作系统必须为64位,且centos内核版本为3.1及以上。
安装docker
安装依赖软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 安装前可查看device-mapper-persistent-data 和 lvm2 是否已经安装
rpm -qa | grep device-mapper-persistent-data
rpm -qa | grep lvm2
设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
更新yum软件包索引
yum makecache fast
安装最新版本docker-ce
yum install docker-ce -y
#安装指定版本docker-ce可使用以下命令查看
yum list docker-ce.x86_64 --showduplicates | sort -r
# 安装完成之后可以使用命令查看
docker version
启动docker服务,
systemctl start docker
添加镜像地址,方便快速下载。
找到/etc/docker目录下的daemon.json文件,没有则直接vi daemon.json,添加如下内容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
构建mysql容器
我们利用官方提供的镜像来构建mysql。
首先去官网docker_hub搜索mysql所有版本。
本文使用最新的8.0.18版本。通过如下命令获取镜像:
docker pull mysql:8.0.18
在官网对应镜像的下方是有使用介绍的,参照官网说明,输入如下命令,启动mysql:
//其中3307代表宿主机的端口,3306代表容器的端口
docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=你的密码不加引号 -p 3307:3306 -d mysql:8.0.18
通过如下命令查看运行的容器:
//查看运行的容器
docker ps
//查询结果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57cdd4b78e0d mysql:8.0.18 "docker-entrypoint.s…" 23 minutes ago Up 20 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp mysql01
//查看所有容器
docker ps -a
运行成功后,可以通过如下几个命令,来停止、删除、启动容器。
//停止容器
docker stop 容器名/容器id
//启动容器
docker start 容器名/容器id
//删除容器
docker rm 容器名/容器id
假如新增的容器有问题,可以删除后,重新添加一个容器
通过如下命令,查看宿主机端口占用
netstat -ntlpu
//查看结果
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 968/sshd
tcp6 0 0 :::3307 :::* LISTEN 1709/docker-proxy
tcp6 0 0 :::22 :::* LISTEN 968/sshd
udp 0 0 127.0.0.1:323 0.0.0.0:* 700/chronyd
udp6 0 0 ::1:323 :::* 700/chronyd
然后我们使用navicat连接mysql,发现会报错,这个问题是因为mysql8导致的,假如是5.多的版本是没问题的。
mysql8需要对其进行一些配置。
首先通过命令,进入mysql容器的命令行:
docker exec -it mysql01 /bin/bash
执行完该命令后,命令行发生了如下变化:
[root@client1 ~]# docker exec -it mysql01 /bin/bash
root@18f1aa52c133:/# ls
可以理解为,从宿主机的命令行,切换到了mysql8.0.18容器的命令行。你可以把它想成另一个centos系统。
然后进入mysql命令行:
mysql -u root -p
密码是在上边我们初次运行容器时设置过的密码。
进入mysql命令行后,我们需要执行如下3个命令,
//给root用户授予所有的权限,假如root用户已经是所有权限了,这部可以省略
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
flush privileges;
//默认的是caching_sha2_password,需要修改为mysql_native_password,否则连接报错
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
通过quit命令,退出mysql。
通过exit命令,退出当前容器命令行。
现在再用navicat连接,应该不会报错了。如果还是报错,也可以进入容器命令行,查看mysql日志,分析问题如何解决。
容器备份及迁移
上边我们对官方的mysql8.0.18镜像做了修改,修改的方式是启动mysql8.0.18容器,修改容器内容。
那么假如别的服务器也需要修改后的容器内容该怎么办呢?有两种方式,可以通过构建私有仓库。这里就不演示。
还有一种方式,就是将修改后的容器保存为一个镜像,然后将镜像生成tar包,拷贝到其他服务器上。
在拷贝到的服务器上重新加载镜像即可。
首先将修改后的容器保存为镜像:
docker commit f8f3c367eb24(当前容器id,通过docker ps -a查看) mysql02:v1.0(保存的镜像名称及tag)
可以通过如下命令查看修改后容器的变更内容:
docker diff 容器id
通过如下命令,将镜像保存为tar包
docker save -o mysql02.tar(tar包名称) mysql02:v1.0(镜像名称)
保存的地址就是当前宿主机的命令行位置。
通过如下命令来加载tar为镜像
docker load --input tar包全名
然后通过如下命令查看是否加载成功
docker images
以上的方式只是举个例子,对于mysql的官方镜像,它的Dockfile文件是固定的,每次运行mysql镜像它都会重新初始化数据库,所以我上边举的例子,是不适用这块的。而且在开发中,不太鼓励使用commit这种方式修改现有容器,使其成为新的镜像。还是鼓励使用Dockfile方式构建镜像。
Dockfile构建镜像
这种方式是最常用的。使用Dockfile构建镜像时,尽量构建单一镜像,单一的意思是不要把很多应用都放在一个镜像里,比如jdk和mysql、tomcat。尽量分别构建镜像。这样更灵活。而且Docker本身是轻量级的,不适合在一个镜像里构建太多东西。
构建的文章参考:https://blog.csdn.net/qq_28710983/article/details/80964519
使用Docker的注意事项
这篇文章写的不错:https://www.cnblogs.com/zuxing/articles/9554093.html
Docker命令大全
Dock和K8S
参考:https://blog.csdn.net/qq_38987057/article/details/85263234