Docker
Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
docker 安装(CentOS)
- 查看 CentOS 系统内核版本,需要高于 3.10
如果内核版本过低,可以参考此链接进行升级。
-
安装 docker
- 移除旧版本
$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
- 安装必要的系统工具
$ 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
- 更新 yum 缓存
$ sudo yum makecache fast
- 安装 Docker-ce
$ sudo yum -y install docker-ce
- 启动 Docker 后台服务
$ sudo systemctl start docker
- 运行 hello-word
由于本地没有 hello-world 镜像,所以从仓库中下载该镜像并在容器中运行。![在这里插入图片描述](https://img-blog.csdnimg.cn/20181224223829426.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpdXloNzM=,size_16,color_FFFFFF,t_70)
- 镜像加速
在 `/etc/docker/daemon.json` 文件 (如果没有,自行创建) 中添加:```json
{"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
```
docker 基本操作
- 查看镜像
$ docker images
- 查看容器
$ docker ps
,如果想要查看已经关闭的镜像可以加上-a
参数 - 删除镜像
$ docker rmi <image-name/id>
,强行删除加上-f
参数 - 删除容器
$ docker rm <container-name/id>
,强行删除加上-f
参数 - 构建镜像
$ docker build -t <image-name> .
,.
表示当前路径,可以使用具体路径代替 - 运行容器
$ docker run -p < 本机端口 >:<docker 容器内部端口 > --name <container-name> -d <image-name>
;- d 参数表示在后台运行容器,并返回容器 ID - 交互模式运行容器
$ docker exec -it <container-name> /bin/bash
;-i
以交互模式运行容器、-t
为容器重新分配一个伪输入终端 - 标记本地镜像,将其归入某一仓库
$ docker tag <image-name[:tag]> <registryhost/username/image-name[:tag]>
- 查看 docker 日志
$ docker logs <container-name>
docker 实战(构建 MySQL 数据库镜像)
- 首先,准备好数据库所需的数据(sql 文件)
-- init.sql --
drop database if exists starwars;
create DATABASE starwars;
use starwars;
create table if not exists people (
_id INT NOT NULL AUTO_INCREMENT,
ID char(100),
Name char(100),
Heigth char(100),
Mass char(100),
Hair_color char(100),
Skin_color char(100),
Eye_color char(100),
Birth_year char(100),
Gender char(100),
Homeworld char(100),
Films char(200),
Species char(200),
Vehicles char(200),
Starships char(200),
primary key(_id)
);
……
……
- 之后,书写
Dockerfile
文件
以 mysql5.7 为基础镜像构建我们所需要的镜像,首先设置 MYSQL_ALLOW_EMPTY_PASSWORD
便于我们对数据库进行数据导入的操作,然后将文件 (相对 / 绝对路径) 拷贝到容器中,最后执行脚本写入数据。
FROM mysql:5.7
# no password
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
# put the file to container
COPY setup.sh /mysql/setup.sh
COPY data/mysql/priviledges.sql /mysql/priviledges.sql
COPY sql/init.sql /mysql/init.sql
# command
CMD ["sh", "/mysql/setup.sh"]
具体 Dockerfile 语法参见链接
- 编写 setup.sh 脚本
#!/bin/bash
set -e
#查看 mysql 服务的状态,方便调试,这条语句可以删除
echo `service mysql status`
echo '1. 启动 mysql....'
#启动 mysql
service mysql start
sleep 3
echo `service mysql status`
echo '2. 开始导入数据....'
#导入数据
mysql < /mysql/init.sql
echo '3. 导入数据完毕....'
sleep 3
echo `service mysql status`
#重新设置 mysql 密码
echo '4. 开始修改密码....'
mysql < /mysql/priviledges.sql
echo '5. 修改密码完毕....'
#sleep 3
echo `service mysql status`
echo 'mysql 容器启动完毕, 且数据导入成功'
tail -f /dev/null
- MySQL 权限设置 priviledges.sql
use mysql;
select host, user from user;
-- 因为 mysql 版本是 5.7,因此新建用户为如下命令:create user starwars identified by 'starwars';
-- 将 starwars 数据库的权限授权给创建的 starwars 用户,密码为 starwars:grant all on starwars.* to starwars@'%' identified by 'starwars' with grant option;
-- 这一条命令一定要有:flush privileges;
- 创建镜像
由于未使用 --name
参数指定容器名称,所以随机生成了一个名字brave_agnesi
- 启动容器
使用 docker logs
命令查看日志:
- 验证数据库镜像是否真正拥有数据
1. 进入容器
2. 登录 mysql,使用我们在priviledges.sql
文件中的用户名密码
尝试查询数据:select * from film;
由上图可知,我们成功插入了数据。