docker最近很火的容器化部署平台。我们可以把docker中的镜像和容器分别理解成类和对象(类的实例 )。本文的测试环境针对mac,linux上可能会有些许不同。
检查Docker Engine,Docker Compose和Docker Machine的版本
MacBook:~ max$ docker --version
Docker version 18.03.1-ce, build 9ee9f40
MacBook:~ max$ docker-compose --version
docker-compose version 1.21.1, build 5a3f1a3
MacBook:~ max$ docker-machine --version
docker-machine version 0.14.0, build 89b8332
测试docker是否已经部署好,可以使用docker run hello-world命令,如果输出如下内容,说明docker已经部署完毕
MacBook:~ max$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
上述命令实际已经运行了一个镜像为hello-world容器,从上面我们看出docker运行hello-world镜像的过程,
1.docker client先与docker daemon(也就是docker server)建立连接
2.docker daemon从 docker hub pull镜像下来
3.docker daemon根据镜像创建了一个容器,并且产生了output那句"Hello from Docker!"
4.docker daemon把output通过docker client输出的终端上,所以我们看到了,那句输出"Hello from Docker!"
至此,这个容器运行完毕,也就退出了。
docker ps命令查看正在运行的容器,所以我们如果要查看全部的容器,需要用到docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7d0a57302d9b hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago distracted_mclean
用docker ps -a 命令发现,目前本地只有一个hello-world的镜像,接下来,我们试着在后台运行一个nigix服务看看
docker run -d -p 80:80 --name webserver nginx
默认会从docker hub下载的镜像都是latest镜像,下载完毕后会在后端启用一个端口为80的web服务。
-d :分离模式: 在后台运行
-p (小写) 参数来指定端口映射,也就是docker daemon中的nginx镜像运行的端口指定为80,并且映射到本地电脑的80端口
--name webserver:表示把这个nginx服务命令为webserver
打开浏览器,查看本地启用的web服务,如下
关闭刚才在后台运行web容器服务
docker stop webserver
如果想运行一个容器
docker start 容器名
删除容器,需要注意的是删除容器时,需要确保容器已经停止运行
docker rm 容器id
接下来,pull一个centos镜像下来,试着在 centos中进行相关的操作,如果centos镜像没有的话,需要先把centos镜像下载下来
拉取tag为latest的centos镜像时,tag可以省略成如下命令
docker pull centos
拉取全部的centos镜像,命令为
docker pull centos -a
提示:
如果出现Status: Image is up to date for centos:latest 说明已经存在了镜像centos:latest
我们查看所有的镜像
docker images
删除镜像
如果你执行了docker pull centos -a操作,在查看所有镜像会发现好多centos都被pull下来了,删除镜像用
如果镜像id相同,需要用docker rmi REPOSITORY:TAG 进行操作,否则会报错
docker rmi 镜像id
运行一个容器
运行docker 中的REPOSITORY为centos,TAG为latest镜像运行一个hello world。运行完毕后,我们查看容器docker ps -a,发现刚才运行的容器已经退出
docker run centos:latest /bin/echo 'hello world'
当然tag为latest时,我们可以简写成
docker run centos /bin/echo 'hello world'
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7d0a57302d9b hello-world "/hello" 19 minutes ago Exited (0) 19 minutes ago distracted_mclean
b349c90cd93d nginx "nginx -g 'daemon of…" 44 minutes ago Exited (0) 43 minutes ago friendly_mahavira
99ecd2d1ec3b centos:latest "/bin/echo 'Hello wo…" About an hour ago Exited (0) About 1 minutes ago sandly_adesa
获取容器的pid
docker inspect --format "{{.State.pid}}" webserver
进入容器
nsenter --target 32439 --mount --uts --ipc --net --pid
默认运行一个容器时,系统会指定一个容器的名字名字,如果需要以特定名字启动一个容器,可以运行
docker run --name mycentos centos /bin/echo 'hello-w'
运行一个指定名字的容器,并且进入对应的容器中
-it实际上时-i和-t的参数的缩写,-i是让容器的终端打开,以便输入东西。-t是开一个伪终端绑定到我们当前的终端上
docker run --name mydocker -it centos /bin/bash
这样,我们就进入了centos容器里面了,新打开一个终端,输入docker ps可以看到正在运行的名为mydocker的centos容器
MacBook:~ max$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
284a76eeb573 centos "/bin/bash" About an hour ago Up About an hour mydocker
MacBook:~ max$
下面的操作在centos容器内部操作了哦
表示查看当前的目录
ls /
[root@284a76eeb573 /]# ls /
bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
查看当前的进程
ps aux
[root@284a76eeb573 /]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 11828 2908 pts/0 Ss 06:01 0:00 /bin/bash
root 14 0.0 0.1 51716 3364 pts/0 R+ 06:24 0:00 ps aux