Ubuntu下的Docker容器化技术体验
简介
容器技术是继大数据和云计算之后又一炙手可热的技术,而且未来相当一段时间内都会非常流行。
对 IT 行业来说,这是一项非常有价值的技术。而对 IT 从业者来说,掌握容器技术是市场的需要,也是提升自我价值的重要途径。
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
实验环境
Ubuntu 20.04
安装Docker
首先我们更新 ubuntu 的 apt 源索引
sudo apt-get update
然后我们通过 apt-get 允许通过 HTTP 使用仓库
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
之后添加 Docker 官方 GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
设置 Docker 稳定版仓库
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
添加仓库后,更新 apt 源索引
sudo apt-get update
安装最新版 Docker CE(社区版)
sudo apt-get install docker-ce
检查 Docker CE 是否安装正确,下载并运行 Hello World
sudo docker run hello-world
显示本地镜像库内容
获得帮助
Docker的基本操作
显示运行中容器
显示所有容器(包含已中止)
继续运行原容器并进入
MySQL和容器化(利用阿里云镜像源)
拉去MySQL镜像
docker pull mysql:5.7
这个时候,我们会发现 pull 得特别慢,那怎么办呢
我们需要换成阿里云的镜像源
我们访问如下的配置文件
vim /etc/docker/daemon.json
在配置文件中加上如下代码
{
"registry-mirrors": ["https://r3u6ty4i.mirror.aliyuncs.com","https://mirror.baidubce.com"],
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"}
}
然后重启 docker 服务即可替换成阿里云镜像源
重启 docker
sudo systemctl restart docker
这个时候我们使用sudo docker info
命令可以查看到镜像源中已经有阿里云镜像源
Registry Mirrors:
https://r3u6ty4i.mirror.aliyuncs.com/
https://mirror.baidubce.com/
这样我们 pull 镜像源就会快很多。
pull完后我们再次使用docker images
命令就可以看到 MySQL
构建docker镜像
首先创建文件夹 mydock
mkdir mydock && cd mydock
vi dockerfile
在其中创建 dockerfile 并录入
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
构建镜像
docker build . -t hello
运行镜像
docker run -it --rm hello -H
然后我们用以下代码尝试运行 MySQL 容器,但是会出现以下报错
sudo docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
前一部分的报错是说 docker 服务启动时定义的自定义链 DOCKER 被清除
根据别人博客的解决方案,重启 docker 即可,但是我们却不行。
后一部分的报错是指3306端口被占用,然后我们通过以下指令来查看是什么进程占用了3306端口。
sudo netstat -apn | grep 3306
这时我们发现是 MySQL 自己的服务器占用了这个端口
此时我们简单的 kill 是不会彻底杀死这个服务器的,服务器会换一个进程继续监听,这个时候我们需要使用以下指令来停止服务(其中 mysqld 是查询到的进程名)
sudo /etc/init.d/mysqld stop
这样3306端口就不会被占用了
这个时候我们再次运行 MySQL 容器就不会报错了
我们再次使用docker ps
命令来查看当前使用的容器,就可以看到 MySQL 已经被创建
连接MySQL
我们之前已经创建好了 MySQL ,现在我们就要连接上我们刚才创建的 MySQL
使用的登录密码是之前创造 MySQ L数据库的时候自己设置的
sudo docker exec -it mysql bash
mysql -uroot -p123456
成功连接会出现下面的提示
这样我们就成功连接到了 docker 中的 MySQL 容器。
MySQL容器数据持久化
但是这样的 MySQL 容器数据是不持久化的,也就是说在我们退出后数据是会被删除的。
这个时候我们就需要在创建 MySQL 容器的时候进行卷的挂载。
在创建 MySQL 数据库的时候我们手动添加 -v
指令,-v
命令代表主机和容器之间的映射关系,后面的两个路径分别为主机路径以及 MySQL 容器内的路径
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
这样创建完的数据库容器就会跟我们本地的数据相映射,在 MySQL 容器内的数据也就可以持久化了