关于镜像构建的两种方法
-
通过commit
- 先从docker hub上下载mysql官方的镜像
- 在容器外面,
docker images
看本机镜像,docker ps;
看本机正在跑的容器 - 然后
docker run --name 容器名 -d 镜像名:镜像tag /bin/bash
进入容器。运行镜像->获得容器 - 通过
service mysql status
查看,可以看到容器里面已经运行了mysql服务 - 然后对数据库做个性化操作,创建用户,数据库,表…
- 最后
docker commit -a "zhouli02" -m "3" 容器id 镜像名:镜像tag
由该容器得到一个镜像image,这个镜像就相当于是在mysql镜像底包上面进行自定义操作之后的新镜像。
-
通过编写Dockerfile
假设当前在/test/Dockerfile, 编写完之后进入到/test/,之后docker build -t 镜像名:镜像tag .
,得到镜像
把镜像存到私有仓库的详细步骤
-
打tag
docker tag golang_mysql:1.70.0 snc-image.af-biz.xxx-inc.cn/golang_mysql:1.70.0
,打tag就是重命名,镜像名要带上私有docker仓库名字,后面才能成功push到私有仓库 -
登录docker私有仓库
docker login snc-image.af-biz.xxx-inc.cn
-
push镜像到docker仓库
docker push snc-image.af-biz.xxx-inc.cn/golang_mysql(镜像名):1.70.0(镜像tag)
,现在名字带有仓库域名 -
Dockerfile , 及相关文件要留着,推到文件对应的仓库(Hyperion-Dockerfile ),存档
遇到的几个问题
-
centos有个比较大的坑,在docker中通过systemctl 启动服务的时候总是会报错,默认情况下容器中的root用户只是host主机的一个普通用户,但如果docker run --privileged=true 就真正的给这个普通用户赋予了和host主机root用户相同的特权。
报错:Failed to get D-Bus connection: Operation not permitted
解决办法:运行镜像时添加–privileged, 如下
docker run --name zhouli02 --privileged=true -itd centos:centos7 /usr/sbin/init docker exec -it zhouli02 /bin/bash
-
直接强制删除容器,这样可以不用stop容器之后再删除 容器不要随便删,之前在容器里面的配置也会消失
docker rm -f 642d34ea30c4d8bb85c582cbfc488014843fe56a4fa6838e3cbcff2a0badab45
-
systemctl start mysqld.service 放在dockerfile 无权限,应该放在setup.sh里,docker run的时候给权限,设置容器启动先执行setup.sh,就会顺带启动mysql数据库服务
-
docker run参数
-v /src/webapp:/usr/share/nginx/html
把宿主机/src/webapp目录挂载到容器的/usr/share/nginx/html目录,理解是宿主机该目录的东西和容器该目录的东西保持一致。-p port1:port2
端口映射,宿主机port1映射到容器port2,在宿主机内访问port1,相当于访问容器port2对应的服务 -
容器内启动mysqld(理解为mysql server)服务失败
解决方案:目录挂载。参考 -
启动镜像
碰到几个问题,docker run之后,再docker exec 进入到容器,报错,有3种情况①
②
③
大概原因是docker容器启动后,没有后台运行,然后就关了,设置-itd
选项docker run --privileged=true --name mysql_con -itd snc-image.af-biz.xxx-inc.cn/mysql:8.0 /bin/bash
常用命令
-
看容器的日志,可以找bug用
docker logs 容器id
-
查容器状态
docker ps -a | grep mysql_con
-
查看容器里进程的状态
docker top conid
-
宿主机连mysql容器里的mysql server
进行了端口映射的,解决方案ALTER USER 'mysql'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; //应该是设置密码的校验方式
-
gitlab runner 跑ci,然后连不上mysql容器里的mysql,使用的是mysql:8.0镜像
原因是.gitlab-ci.yml,里的环境变量没有生效,换用mysql:5.6镜像即可variables: MYSQL_DATABASE: hyper MYSQL_USER: mysql MYSQL_PASSWORD: 123456 MYSQL_ROOT_PASSWORD: root #理解是这些环境变量配置之后,是给mysql容器用的,用于设置mysql容器
宿主机连mysql服务用
docker pull mysql:8.0 //拉镜像
docker run --name zhouli02 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=hyper -e MYSQL_USER=mysql -e MYSQL_PASSWORD=123456 -p 54424:3306 -d mysql:8.0 //对mysql容器做配置
mysql -h 127.0.0.1 -P 54424 -u root -p 连接数据库
ALTER USER 'mysql'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; //应该是设置密码的校验方式