我们继续上篇的讨论,没有看过 docker 实战攻略 的朋友可以先看它,下面,我们直接进入主题。
上篇,我讲到 docker 开机启动服务,类似我们的 linux 系统开机自启 nginx、mysql等,docker 一旦命令执行完毕就会退出,而启动的时候执行的命令是创建时传入的最后一个参数,如果不传入,默认是 docker 镜像的命令。
现在,我们启动 nginx ,先终端 查找 which nginx,我这边输出是 /usr/sbin/nginx,然后输入 nginx 并回车,浏览器打开 127.0.0.1 会打开默认的 nginx 页面。现在,修改 start.sh 让他先启动 nginx 然后启动 bash 做到即让 nginx 启动了也不至于命令执行完毕而退出了。修改后的 start.sh 如下:
/usr/sbin/nginx /bin/bash
现在复制到 docker 里:docker cp start.sh nginx:/usr/local/bin/
然后重启下 nginx 这个容器,你会发现 nginx 启动了,如果你需要这个容器开机的时候启动其他软件,你都可以写到 start.sh 里面即可。
docker 开机自启、开机启动容器
docker 的开机自启很简单,sudo systemctl enable docker 即可,docker 容器开机自启可以先 sudo vim /etc/systemd/system/docker-container\@.service
接着写入如下内容:
[Unit] Description=Docker Container %I Requires=docker.service After=docker.service [Service] Restart=always ExecStart=/usr/bin/docker start -a %i ExecStop=/usr/bin/docker stop -t 2 %i [Install] WantedBy=default.target
如果你需要需要 nginx 容器开机自启,则执行 sudo systemctl enable docker-container\@nginx.service,但是这样自启动的 docker 无法通过 docker stop nginx 停止,停止后也会自动重启,你可以使用 systemctl stop docker-container\@nginx.service 来停止这个 docker,也可以将上面的 Restart=always 改为 Restart=no 或者直接删除,默认应该就是 no
现在,我们提交对这个 docker 的修改,最好先停止这个 docker ,不停止也 OK。
docker 保存修改,docker push 镜像
1、先 docker ps -a 拿到 nginx 容器的 container id,我的是 04916ef24e48 ,接着 commit
docker commit -m 'nginx container with custom command' -a 'ijustyce@163.com' 04916ef24e48 nginx:v1
2、使用 docker images 查看本地镜像,发现多了一个 nginx ,tag v1,并且有 image id,现在,我们 tag 这个镜像,tag 的作用是push的时候push到tag的这个url上
docker tag 167f882fdc9b registry.cn-hangzhou.aliyuncs.com/chun/nginx:v1
这里 167f882fdc9b 是镜像 id,通过 docker images 获取,最后,我们 push docker
3、docker push registry.cn-hangzhou.aliyuncs.com/chun/nginx:v1
关联 docker,node js 的 docker 连接 mysql 的 docker
关联 docker 比较简单,只需要 --link 就行,比如 docker run xxx --link mysql:mysql xxx 之后的程序里,连接 mysql 时,host 写 mysql 即可!
创建 docker 镜像
创建 docker 镜像一般有两种方式,最简单的方式是,自己先 pull 一个基本的镜像比如 debian, 然后创建一个容器,接着在这个容器里做你自己的修改,最后保存对这个容器的修改并push,这部分前面已经说了,很简单。另外,你还可以通过 dockerfile build 镜像,这又是另一个话题了,或者通过 docker-compose 来做也行。一般的,我不建议你使用 docker run --name 这种方式,尽量尝试用 docker compose 吧,我后期会补充 dockerfile 以及 docker-compose 方面的知识。如果你了解这两篇文章所介绍的 docker 知识,那么你使用 docker 基本没啥问题了,至于 dockerfile 以及 docker-compose 属于后期的东西了,掌握这两个以后,你可以考虑学习点 k8s 的知识了。