Docker必知必会

关于镜像构建的两种方法

  1. 通过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镜像底包上面进行自定义操作之后的新镜像。
  2. 通过编写Dockerfile
    假设当前在/test/Dockerfile, 编写完之后进入到/test/,之后docker build -t 镜像名:镜像tag .,得到镜像

    参考博客

    Dockerfile书籍1

    Dockerfile书籍2

把镜像存到私有仓库的详细步骤

  1. 打tag

    docker tag golang_mysql:1.70.0 snc-image.af-biz.xxx-inc.cn/golang_mysql:1.70.0,打tag就是重命名,镜像名要带上私有docker仓库名字,后面才能成功push到私有仓库

  2. 登录docker私有仓库
    docker login snc-image.af-biz.xxx-inc.cn

  3. push镜像到docker仓库
    docker push snc-image.af-biz.xxx-inc.cn/golang_mysql(镜像名):1.70.0(镜像tag),现在名字带有仓库域名

  4. Dockerfile , 及相关文件要留着,推到文件对应的仓库(Hyperion-Dockerfile ),存档

遇到的几个问题

  1. 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
    
  2. 直接强制删除容器,这样可以不用stop容器之后再删除 容器不要随便删,之前在容器里面的配置也会消失

    docker rm   -f 642d34ea30c4d8bb85c582cbfc488014843fe56a4fa6838e3cbcff2a0badab45
    
  3. systemctl start mysqld.service 放在dockerfile 无权限,应该放在setup.sh里,docker run的时候给权限,设置容器启动先执行setup.sh,就会顺带启动mysql数据库服务

  4. docker run参数 -v /src/webapp:/usr/share/nginx/html把宿主机/src/webapp目录挂载到容器的/usr/share/nginx/html目录,理解是宿主机该目录的东西和容器该目录的东西保持一致。-p port1:port2端口映射,宿主机port1映射到容器port2,在宿主机内访问port1,相当于访问容器port2对应的服务

  5. 容器内启动mysqld(理解为mysql server)服务失败
    解决方案:目录挂载。参考

  6. 启动镜像
    碰到几个问题,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 
    

常用命令

  1. 看容器的日志,可以找bug用

    docker logs 容器id
    
  2. 查容器状态

    docker ps -a | grep mysql_con
    
  3. 查看容器里进程的状态

    docker top conid
    
  4. 宿主机连mysql容器里的mysql server

    进行了端口映射的,解决方案

    ALTER USER 'mysql'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; //应该是设置密码的校验方式
    
  5. 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'; //应该是设置密码的校验方式 

猜你喜欢

转载自blog.csdn.net/qq_40642465/article/details/121390815