第一个Docker容器

目标:

  1. 在linux虚拟机上安装docker

  2. 编写Dockefile 编译出一个image去运行nginx服务器

步骤:

1.ssh登录linux虚拟机,安装docker ,详见官方文档:https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

2.在用户跟目录下面创建一个DockerTest的目录,并且创建一个名为Dockerfile的文件,内容如下:

1
2
3
4
5
6
7
8
#This is a sample Image
FROM ubuntu:18.04
MAINTAINER kevin

RUN apt-get update
RUN apt-get install -y nginx
#RUN /etc/init.d/nginx restart 不管用
CMD ["nginx", "-g", "daemon off;"]

3.运行如下命令生成新的image:

1
docker build -t mynginx:v1 .

4.运行 docker image ls 命令查看新生成的image

5.输入如下命令生成一个容器去运行nginx web 服务器:

1
2
3
#宿主机的81端口对应容器nginx的80端口(记得在azure虚拟机上开放81端口),-d参数表示后端运行这样即使cmd窗口关闭nginx容器还会继续在后端运行
docker run --name mynginx -d -p 81:80 mynginx:v1
docker container ls -a

6.push 自己的image到docker hub上

1
2
3
docker login
docker tag mynginx:v1 zxlman/mynginx:v1 #把image打包然后发布到dockerhub
docker push zxlman/mynginx:v1

7.登录到dock hub上查看image

8.登录 xxxxx:80查看nginx web服务器是否启动成功:

Tips:

注意Dockerfile的最后一行文件:CMD ["nginx", "-g", "daemon off;"], 这样是为了保持nginx一直保持在前端运行,否则容器启动完成会自动退出导致无法访问nginx 详见nginx 官方文档https://hub.docker.com/_/nginx.

If you add a custom CMD in the Dockerfile, be sure to include -g daemon off; in the CMD in order for nginx to stay in the foreground, so that Docker can track the process properly (otherwise your container will stop immediately after starting)!

Then build the image with docker build -t custom-nginx . and run it as follows:

Docker 容器启动时,默认会把容器内部第一个进程,也就是pid=1的程序,作为docker容器是否正在运行的依据,如果 docker 容器pid=1的进程挂了,那么docker容器便会直接退出。Docker未执行自定义的CMD之前,nginx的pid是1,执行到CMD之后,nginx就在后台运行,bash或sh脚本的pid变成了1。所以一旦执行完自定义CMD,nginx容器也就退出了.