docker常用技巧

记录玩docker时的一些小操作,持续更新中~~

本文不介绍docker,只记录自己玩 docker 过程中碰到的一些坑和一些常用的操作。

给个参考文档链接:传送门</p>

一、踩坑记

    1)碰到的第一个大坑

    就是启动容器的时候碰到的,找了好久的错误原因,一直在防火墙端找原因,最后发现,是需要将 docker 重启下,然后 iptables -save 即可。

    错误如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@iZuf64xswj2tx8htjph7evZ&nbsp;~]#&nbsp;docker&nbsp;images
REPOSITORY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TAG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMAGE&nbsp;ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CREATED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SIZE
docker.io/gogs/gogs&nbsp;&nbsp;&nbsp;latest&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;52cda4ee19a5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13&nbsp;days&nbsp;ago&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;138.4&nbsp;MB
docker.io/percona&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;latest&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9b84b010bb1a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;weeks&nbsp;ago&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;393.6&nbsp;MB
[root@iZuf64xswj2tx8htjph7evZ&nbsp;~]#&nbsp;docker&nbsp;create&nbsp;--name&nbsp;percona&nbsp;-v&nbsp;/data/mysql-data:/var/lib/mysql&nbsp;-p&nbsp;3306:3306&nbsp;-e&nbsp;MYSQL_ROOT_PASSWORD=root&nbsp;percona
0987f4a3f1677102b7aab58490e2ed6ecd1557dc17e6591f3f0e8d3fe91b9634
[root@iZuf64xswj2tx8htjph7evZ&nbsp;~]#&nbsp;docker&nbsp;ps&nbsp;-a
CONTAINER&nbsp;ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COMMAND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CREATED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NAMES
0987f4a3f167&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;percona&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"docker-entrypoint.sh"&nbsp;&nbsp;&nbsp;11&nbsp;seconds&nbsp;ago&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Created&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;percona
[root@iZuf64xswj2tx8htjph7evZ&nbsp;~]#&nbsp;docker&nbsp;start&nbsp;percona
Error&nbsp;response&nbsp;from&nbsp;daemon:&nbsp;driver&nbsp;failed&nbsp;programming&nbsp;external&nbsp;connectivity&nbsp;on&nbsp;endpoint&nbsp;percona&nbsp;(53c8c06350100d9218b53cbcaf834df1d7e21739205602d249a3bf1093d031ba):&nbsp;iptables&nbsp;failed:&nbsp;iptables&nbsp;--wait&nbsp;-t&nbsp;nat&nbsp;-A&nbsp;DOCKER&nbsp;-p&nbsp;tcp&nbsp;-d&nbsp;0/0&nbsp;--dport&nbsp;3306&nbsp;-j&nbsp;DNAT&nbsp;--to-destination&nbsp;172.17.0.2:3306&nbsp;!&nbsp;-i&nbsp;docker0:&nbsp;iptables:&nbsp;No&nbsp;chain/target/match&nbsp;by&nbsp;that&nbsp;name.
&nbsp;(exit&nbsp;status&nbsp;1)
Error:&nbsp;failed&nbsp;to&nbsp;start&nbsp;containers:&nbsp;percona


    2)docker 安装 gogs

        制作容器:docker create —name=gogs -p 10022:22 -p 10080:3000 -v /data/gogs:/data —link percona:percona gogs/gogs

            (上述,命令中的 link 意思是和同样是用 docker 启动的数据库进行连接)

        然后正常启动,正常访问   ip:10080,第一次访问需要在界面进行配置,但是重启 gogs 这个容器之后,再使用 ip:10080 就访问不了,尴尬。

        最后反复研究,发现,其实是在页面配置的时候配置错了,看官网文档,如下:

            原因是 HTTP port 配置错了,以为是填写服务器映射的端口10080,其实是填写 docker 内部的端口 3000。

            所以,还是要看官方文档才最靠谱。

            docker04.png

    3)docker 安装 wordpress

        顺势将云虚拟主机上的WordPress 迁移到此,迁移很简单,

        step1,备份数据库至新安装的percona;

        step2,将原来的WordPress 全部文件复制至服务器 /data/wordpress/www/

        step3,安装wordpress,docker run —name wordpress —link percona:percona -p 8888:80 -v /data/wordpress/www:/var/www/html -d wordpress

        下面就是踩过的两个天坑,

            ① 需要修改配置文件  wp-config.php 里面的数据库连接,如图:注意此处的数据库 host,不能写类似 127.0.0.1 之类的本地ip,要么写对外的数据库地址,要么写 percona

                001.png

            ② 如果域名有变更的话,也要记得去数据库修改下域名信息,我们采用了 nginx 做了反向代理,所以要使用域名来访问,但是发现,只有主页和后台可以访问,其余全部都是 404,

                002.png

                后来反复研究,原以为是 Apache 和 Nginx 伪静态的设置不一致造成的,其实不是,后来在后台想直接升级 wordpress,发现提示要提供 ftp 信息,后来才发现,是挂在目录的权限设置没到位,只需下面一行语句轻松搞定:

                    docker exec wordpress chown -R www-data:www-data /var/www/html

                    或者进入交互端进行操作:                  

                    docker exec -i -t wordpress bash

                    chown -R www-data:www-data /var/www/html

                


二、操作

    1)安装

        推荐 Ubuntu 系统,但是我是装在 Centos7 上面的,所以下文所有操作都是在 Centos 7上,在6上面安装会有很大的坑。

        安装:yum install -y docker

        查看版本:docker version

        重启服务:service docker restart

    2)镜像

        列出所有镜像:docker images

        删除镜像:docker rmi [镜像名/image id]

        下载镜像:docker pull mysql

                         或者 docker pull mysql:5.7 mysql

                         后面可以加版本号和重命名

        搜索镜像:docker search mysql

    3)镜像加速(仓库)

        默认 pull 的是从官方的仓库,在国内,可以找一个更快的国内源,如阿里云的:https://dev.aliyun.com/search.html

        两种方式:

            ① 直接从指定仓库 pull

                如:docker pull registry.cn-hangzhou.aliyuncs.com/acs-sample/mysql:5.7

            ② 在阿里云的容器服务内(https://cr.console.aliyun.com/#/accelerator),我们可以查到阿里云的docker镜像加速器的使用,以下是我个人的加速器配置,

                前提是,Docker客户端版本大于1.10.0

                可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:

1
2
3
4
5
6
7
8
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sudo&nbsp;mkdir&nbsp;-p&nbsp;/etc/docker
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sudo&nbsp;tee&nbsp;/etc/docker/daemon.json&nbsp;<<-&#39;EOF&#39;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"registry-mirrors":&nbsp;["https://6jbywkhi.mirror.aliyuncs.com"]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EOF
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sudo&nbsp;systemctl&nbsp;daemon-reload
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sudo&nbsp;systemctl&nbsp;restart&nbsp;docker

    4)容器

        查看所有容器:docker ps -a

        查看正在运行的容器:docker ps

        创建容器:docker create —name percona -v /data/mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona

                       说明:—name 是命名这个容器,-v 是指定数据卷(本机:容器),-p 端口映射(本机实际:docker内),-e 参数设置,最后一个percona是镜像的名字

        启动/停止/重启容器:docker start/stop/restart [容器名]

        创建并启动容器:docker run -d

        进入容器:docker exec -it imageName /bin/bash

        查看日志:docker logs -f imageName


    5)镜像制作

        需求:springboot 打包了一个 jar 程序,现在要使用 docker 制作一个镜像来运行这个程序。

        实现:

            ① 创建项目用的文件夹并上传 jar 包至此文件夹内

                docker01.png

            ② 制作关键文件 Dockerfile

                vim Dockerfile

                内容如下:

1
2
3
4
5
6
7
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;java:8
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COPY&nbsp;./wechat-0.0.1-SNAPSHOT.jar&nbsp;/wechat/wechat-0.0.1-SNAPSHOT.jar
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COPY&nbsp;./app-entrypoint.sh&nbsp;/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RUN&nbsp;chmod&nbsp;+x&nbsp;/app-entrypoint.sh
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPOSE&nbsp;9092
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENTRYPOINT&nbsp;["/app-entrypoint.sh"]

                说明:

                    FROM:基础镜像是 java 的 8 版本(因为我们运行 jar 程序需要 java 运行环境)

                    COPY:将当前文件夹下的 jar 包 复制到 镜像中的 /wechat/ 目录下

                    COPY:将当前目录下的部署程序的shell脚本上传到 / 目录下

                    RUM: 赋予权限,然后运行我们上传的运行脚本

                    EXPOSE:docker 容器暴露出来的 端口

                    ENTRYPOINT: 入口,即docker 启动之后执行的脚本

            ③ 制作启动脚本

                vim app-entrypoint.sh

                内容如下:

1
2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#!/bin/bash
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java&nbsp;-jar&nbsp;/wechat/wechat-0.0.1-SNAPSHOT.jar

                说明:

                        第一行么就是 sh 脚本必备的,第二行就是执行 jar 程序必须的操作

            ④ 关键:镜像制作

                由于我们当前目录下只有上文提到的三个文件,如下图:

                docker02.png

                执行: docker build -t wechat:1.0.0 .

                    说明:wechat:1.0.0 是自定义的镜像的名字和版本

                                . 就是代表当前文件夹下的所有文件

                docker images 便可以看到我们的镜像了

            ⑤ 创建容器并允许

                docker create —name wechat -t -p 9092:9092 wechat:1.0.0

                docker start wechat && docker logs -f wechat

                docker ps 便可以查看所有正在允许的镜像

                

    6)镜像推送到仓库

        




------ 本文结束 感谢阅读 ------
0%