目录
本文概览:介绍了docker镜像(docker镜像的相关操作、通过Dockfile构建镜像、Dockfile的格式)和docker容器相关操作。
1 Docker容器和镜像
1、定义
“用户是基于镜像来运行容器,镜像可以看做是容器的源代码” 怎么来理解这句话?
镜像是指 构建和打包阶段 的docker代码;容器是指 运行阶段 的docker代码,都是指同一个代码,只是在不同阶段的一个表述而已。
2、理解
可以通过 OS镜像 和 操作系统的概率来理解,未安装时,还在光盘上的就是镜像(docker镜像);当装载到PC上,并运行的时候就是操作系统(docker 容器)。当刚关机之后,操作系统仍然是存在的,只要开机他就可以再次运行操作系统;同样,docker容器在关闭之后仍然存,通过docer start重新启动容器,除非通过docker run才能从主机移除。
2 Docker镜像
2.1 查看和下载镜像
1、查看服务器上有哪些镜像
第一列为镜像名字、第二列为版本,第一列和第二列组合成唯一键,如上的ubuntu有latest和14.04两个版本。
1 2 3 4 5 |
HeartThinkDo@B000000064800:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest b8efb18f159b 4 days ago 107MB ubuntu latest 14f60031763d 9 days ago 120MB ubuntu 14.04 54333f1de4ed 9 days ago 188MB |
对于ubunt存在多个版本,我们在运行时可以通过冒号和标签名来知道该仓库的某一镜像。如下命令:
1 |
docker run -i -t unbuntu:14.04 /bin/bash |
2、在Docker Hub上查找公用镜像库
(1)通过 docker search命令查看
1 2 3 4 |
HeartThinkDo@B000000064800:~$ docker search solr NAME DESCRIPTION STARS OFFICIAL AUTOMATED solr Solr is the popular, blazing-fast, open so... 415 [OK] makuk66/docker-solr Solr is the popular, blazing-fast, open so... 80 [OK] |
(2)通过 https://hub.docker.com/ 直接查找
3、从镜像仓库下载镜像,有点类似从git仓库下载代码。
1 |
docker pull ubuntu:14.04 |
2.2 通过Dockfile构建镜像
通过Dockerfile和docker build命令来创建镜像。把构建命令按照执行顺序写到dockfile中,然后通过docker build来执行dockfile。dockerfile有点类似makefile思想,makefile中保存指令,通过make操作执行makefile。
2.2.1 Dockerfile格式
1、Dockerfile格式
- Dockerfile中命令必须是大写。
- Dockerfile第一条命令必须是FROM。FROM指定的镜像必须是已经存在的镜像,我们都是基于基于已经存在的镜像创建新的镜像。
2、具体的DockerFile中命令如下:
(1)FROM
(2)MAAINTAINER
(3)ENV 在构建镜像时设置环境变量
(4)RUN 用来执行shell命令。如下
1 |
RUN apt-get -vim update |
(5)CMD
和RUN相比,RUN是在构建镜像时运行的命令,而CMD是在容器启动时运行的命令。
(6)VOLUME
举例为
1 |
VOLUME ["/usr/local/project","/usr/local/data"] |
2.2.2 执行DockerFile
通过docker build命令来执行DockerFile。具体格式如下
docker build -t=”HeartThinkdDo/firstWeb:v1″ ~/file
-t 表示最终的镜像名称
~/file 是指DockerFile的目录信息,是自己指定的。
2.2.3 DockerFile实例
2.3 常用镜像
1、JDK
选择使用openjdk,https://hub.docker.com/_/openjdk/
3 容器
3.1 创建、启动和关闭容器
1、检查docker是否启动,在没有启动时如下
1 2 |
HeartThinkDo@B000000064800:~$ docker info Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? |
启动之后,如下信息:
1 2 3 4 5 6 7 8 9 10 |
HeartThinkDo@B000000064800:~$ docker info Error response from daemon: Bad response from Docker engine HeartThinkDo@B000000064800:~$ docker info Containers: 1 Running: 0 Paused: 0 Stopped: 1 Images: 1 Server Version: 17.06.0-ce .... |
2、创建并运行容器-run命令
(1)交互式运行的容器
1 |
docker run -i -t ubuntu /bin/bash |
其中
- -i
- -t
(2)守护式运行的容器
通过 “-d” 来指定。如下
1 2 |
HeartThinkDo@B000000064800:~$ docker run --name houtai -d ubuntu /bin/sh 53afa0eb40a69c682d1ac07185a4c12a94efa09fe05fb4358b66a577b648b125 |
(3)公用参数
- 容器重命名 –name
1 |
docker --name container_name -i -t unbuntu /bin/bash |
- 指定端口 -p ,”-p 服务器端口:容器端口”将服务器端口映射到容器的端口
3、查看服务器上的运行的docker容器有哪些
通过 “docker ps”命令查看,第一列是容器id,第二列是对应镜像,最后一列是容器名称。
1 2 3 |
HeartThinkDo@B000000064800:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 624ee212c681 nginx "nginx -g 'daemon ..." 33 hours ago Exited (0) 33 hours ago webserver |
如果是查看所有容器,通过“-a”参数:
1 2 3 4 5 |
HeartThinkDo@B000000064800:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c3ad738958bf ubuntu "/bin/bash" 3 minutes ago Up 3 minutes elegant_brattain 53afa0eb40a6 ubuntu "/bin/sh" 38 hours ago Exited (0) 38 hours ago houtai 624ee212c681 nginx "nginx -g 'daemon ..." 5 days ago Exited (0) 44 hours ago webserver |
4、重新启动容器
对于交互式的容器,只要关了终端或者退出终端,容器就停止了,需要重新启动,可以通过容器的id或者name来启动docker。如下
1 |
docker start container_id/contailner_name |
为了重新进入终端,通过如下命令
1 2 |
HeartThinkDo@B000000064800:~$ docker attach 901f46c81cbd root@901f46c81cbd:/# |
5、停止容器
通过容器名称或者容器id来停止容器
1 |
docker stop container_name |
6、删除容器
(1)删除某一个容器
1 |
dcker rm c1_name |
(2)删除所有容器
1 |
docker rm ` docker ps -a -q` |
3.2 查看容器内运行时信息
1、查看容器内的进程
1 |
docker top c1_name c2_name ... |
2、查看容器统计信息
1 |
docker stats c1_name c2_name ... |
3、查看容器日志
通过“docker logs”来查看这个容器的操作日志,其中“-t会把日志时间打印出来。还可以使用 “-f”,效果类似于“tail -f”的效果
1 2 3 |
HeartThinkDo@B000000064800:~$ docker logs -t c3ad738958bf 2017-07-31T23:56:49.081680043Z root@c3ad738958bf:/# exit 2017-07-31T23:57:13.895520826Z root@c3ad738958bf:/# ^C |
3.3 在容器中执行任务
1、主要分为后台执行和交互式命令,两者区别是:
(1)后台命令
命令在后台执行。通过“-d”来实现,如下命令,在后台执行了创建newuser目录的命令
1 |
docker exec -d c3ad738958bf mkdir /home/newuser |
(2)非后台命令 直接把”-d“去掉就可以了。表示只有等当前命令执行完成之后,才能输入下个命令。
1 |
docker exec 43a870514f93 jps |
2、调出终端
这个属于交互式命令
1 |
docker exec -t -i c3ad738958bf /bin/bash |
(全文)