[root@docker ~]# docker run --rm -it --name b1 busybox
#
按crtl + p +q 从终端拆除(转入后台)
#查看容器
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
356979c81de8 busybox "sh" About a minute ago Up About a minute b1
说明:可以看到运行状态是up 容器名指定为b1 可以通过docker stop b1 停止 (由于 --rm选项)即容器删除
[root@docker ~]# docker stop b1
b1
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker ~]#
示例:后台启动容器 b1
[root@docker ~]# docker run -d -it --name b1 busybox
b8548d53a69999b0c351dc779ebf18cdcfd40dc4d749bc7a6cec300d3ad958e5
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b8548d53a699 busybox "sh" 17 seconds ago Up 16 seconds b1
[root@docker ~]# docker stop b1
b1
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b8548d53a699 busybox "sh" 49 seconds ago Exited (137) 14 seconds ago b1
说明:通过后台启动模式,在停止运行后 容器处于退出停止状态,并不会删除,下次可以通过 docker start b1再次启动,--rm和-d不能同时存在。
运行容器(进入容器操作)
[root@docker ~]# docker run -it --name b1 busybox
/ # mkdir -pv /data/html
created directory: '/data/'
created directory: '/data/html'
/ # echo " Busybox httpd server" >/data/html/index.html
/ # cat /data/html/index.html
Busybox httpd server
/ # httpd -h /data/html
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
....省略....
/ # netstat -ntpul
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 :::80 :::* LISTEN 8/httpd
按ctrl +p +q 进入后台(拆除终端)
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
477cf5b3abca busybox "sh" 4 minutes ago Up 4 minutes b1
从以上可以看出在b1容器中启动了http 并侦听在80端口上;拆除终端进入了后台运行;
基于运行中的b1容器制作镜像并打上新的标签名"docker.io/dyc2005/bbox:v0.1.1-httpd"
[root@docker ~]# docker commit -p -a "san " b1 docker.io/dyc2005/bbox:v0.1.1-httpd
sha256:c4e8c59c4b577a568002789e7c266828a8e86dd9fdd825b05f91933a5e9710f0
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dyc2005/bbox v0.1.1-httpd c4e8c59c4b57 6 seconds ago 1.15MB
busybox latest 8ac48589692a 9 days ago 1.15MB
此时新的镜像ID和busybox(产生b1容器)镜像ID已经 不同了,此时也可通过
docker push 推到镜像库中
验证:
基于新的镜像后台启动容器b2
补充:与上面效果类似
[root@docker ~]# docker commit -a "san" -c 'CMD ["/bindocke/httpd","-f","-h","/data/html"]' b1 docker.io/dyc2005/bbox:v0.1.2-httpd
#运行制作好的镜像:
[root@docker ~]# docker run --name h2 -it dyc2005/bbox:v0.1.2-httpd
[root@docker ~]# docker exec h2 ps
PID USER TIME COMMAND
1 root 0:00 /bin/httpd -f -h /data/html
8 root 0:00 ps
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7147cb559d9 dyc2005/bbox:v0.1.3-httpd "/bin/httpd -f -h /d…" 22 seconds ago Up 21 seconds h2
[root@docker ~]# docker exec -it b2 /bin/sh
/ # netstat -ntpul
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 :::80 :::* LISTEN 1/httpd
/ #
通过 docker exec 就可以进行运行在容器前端的中修改容器中的内容!这也是attach与exec命令的区别所在!
另外本次运行镜像端口没有做映射,后面会提到!一般不推荐如此制作镜像;制作镜像推荐使用Dockerfile文件
基于镜像制作
编辑 Dockerfile,而后根据此文件制作;
详细说明参照这里
以下给出实例:
宿主机上创建bbox
[root@docker ~]# mkdir -pv bbox/data
[root@docker ~]# cat /data/html/index.html
<h1>Busybox httpd server from Dockerfile.</h1>
[root@docker ~]#cat Dockerfiel
FROM busybox:latest
MAINTAINER "san" ""
#COPY index.html /data/html/
COPY data /data/
VOLUME /data/html
EXPOSE 80/tcp
ENV epel_repo_file http://172.16.0.188/epel.repo
ADD ${epel_repo_file} /etc/yum.repos.d/
RUN /bin/adduser -D myuser && \
/bin/mkdir /tmp/dir -pv
注意请自行模拟一个可访问的http能访问到的epel.repo
在bbox目录中运行
[root@docker bbox]# docker build -t docker.io/dyc2005/busybox/v.1.1-httpd ./
Sending build context to Docker daemon 4.096kB
Step 1/8 : FROM busybox:latest
---> 8ac48589692a
Step 2/8 : MAINTAINER "san" ""
---> Using cache
---> 3105f31095b2
Step 3/8 : COPY data /data/
---> Using cache
---> 355f7a29fd45
Step 4/8 : VOLUME /data/html
---> Using cache
---> 4111c015d683
Step 5/8 : EXPOSE 80/tcp
---> Using cache
---> 6f2ef2457118
Step 6/8 : ENV epel_repo_file http://172.16.0.188/epel.repo
---> Using cache
---> d1ac10e625c4
Step 7/8 : ADD ${epel_repo_file} /etc/yum.repos.d/
Downloading [==================================================>] 10B/10B
---> 943a7f280b6e
Step 8/8 : RUN /bin/adduser -D myuser && /bin/mkdir /tmp/dir -pv
---> Running in 15bb73b0690d
created directory: '/tmp/dir'
Removing intermediate container 15bb73b0690d
---> e2ff30f1beb2
Successfully built e2ff30f1beb2
Successfully tagged dyc2005/busybox/v.1.1-httpd:latest
##查看新生成的镜像并运行
[root@docker bbox]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dyc2005/busybox/v.1.1-httpd latest e2ff30f1beb2 52 seconds ago 1.15MB
[root@docker bbox]# docker run -it --rm --name d1 dyc2005/busybox/v.1.1-httpd
/ # id myuser
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser)
/ # ls /tmp/dir/
/ # ls /tmp/
dir
/ #
可以看出新生成的镜像已经完成了指定的操作
到此镜像制作的两咱方法已经小试牛刀的演示完,推荐用dockerfile文件生成镜像,Dockerfile中的每一行的命令都是一层
因此建议使用command && command && ...这种方式;
五、镜像的导入与导出以及使用Volume(外部的目录) 将镜像文件导出为tar文件
docker save #镜像保存成文件(在没有仓库的情况下)
Save one or more images to a tar archive (streamed to STDOUT by default)
docker save [OPTIONS] IMAGE [IMAGE...]
示例:docker save -o /root/nginx-v0.1.0.tar 4481eeccc973 从tar文件导入镜像
docker load ##从文件导入成镜像
Load an image from a tar archive or STDIN
docker load [OPTIONS]
--input, -i Read from tar archive file, instead of STDIN
--quiet, -q false Suppress the load output
示例
# docker load -i nginx-v0.1.0.tar
重新打标签
[root@docker ~]# docker tag 4481eeccc973 docker.io/dyc2005/nginx.v0.1.0
Bind mount volume :容器内和宿主机上都是用户指定
[root@docker ~]# run -it --name bbox1 -v /data/html busybox:v1.0
[root@docker ~]# cat /var/lib/docker/volumes/163a16717cb1d859869cdd7a87a3ad91b04e754ff26130d9145fe0c4ccf94e05/_data# cat index.html
c1
[root@docker ~]#docker inspect -f {{.Config.Volume}}{{.Mounts}} bbox1
Docker-managed volume :容器内用户指定,宿主机上的目录默认在/var/lib/docker/volumes 由docker指定
[root@docker ~]#docker run -it -v HOSTDIR:VOLUME --name bbox2 busybox:v1.0
[root@docker ~]# mkdir -pv /tmp/data(宿主机上)
[root@docker ~]# echo " Test Page in App1" >/tmp/data/index.html
[root@docker ~]# docker run --name h2 -d -it -v /tmp/data:/data/html dyc2005/bbox:v0.1.3-httpd
[root@docker ~]# curl http://172.17.0.2
Test Page in App1
[root@docker ~]# docker inspect -f {{.Mounts}} bbox2 列出volume卷:
[root@docker ~]#docker inspect -f {{.Mounts}} bbox2
docker volume list
DRIVER VOLUME NAME
local 163a16717cb1d859869cdd7a87a3ad91b04e754ff26130d9145fe0c4ccf94e05