一、容器基本使用:
1、容器状态:
running(运行)、stopped(停止)、paused(暂停)、created(刚创建还未启动)
2、查看容器状态
# docker container ps = docker ps
[root@bogon ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c12cba9df0dc redis:4-alpine "docker-entrypoint.s…" 58 seconds ago Up 57 seconds 6379/tcp redis
75665fe0aa94 nginx "/docker-entrypoint.…" 2 weeks ago Up 2 weeks 0.0.0.0:80->80/tcp ningx-1
CONTAINER ID:指容器ID
IMAGE:容器镜像
COMMAND:这个容器内部运行得程序是什么
CREATED:创建时间
STATUS:状态
PORTS:监听端口
NAMES:名称
3、创建容器
# docker create
#docker run
选项:-t //表示给启动的容器附加一个伪终端
-i //进入交互式接口模式
注意:-i与-t在create时无法使用,原因在于-i-t是为了启动时交互式连入,其它选项create与run的区别不大
--name //指名容器名称
--network //指定网络接口(不指定的话默认是bridge,docker0桥)
--rm //如果这个容器停止了则立即将其删除
-d //运行至后台
注意:-d和--rm选项是不能同时存在的,因为送到后台去它不占用你前台,rm无法判断你什么时候终止
[root@bogon ~]# docker run --name redis -d redis:4-alpine //在后台运行redis容器
c12cba9df0dc52d2404f126229721764ad9451ba34aed31b2ac14b6b9c043ebf
root@bogon ~]# docker run --name web -it --rm nginx:1.15-alpine /bin/sh //运行容器,在容器停止时将其删除
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03
inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:586 (586.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
注意:我们自己在做容器时一定要记住一个基本法则,你的镜像内唯一要运行的程序一定必须要运行在前台。我们此前在启动服务时比如httpd它默认一回车会到后台,这在容器内是不被允许的,原因在于如果容器内运行一个httpd启动跑后台后,你的容器自己会认为无支撑者,哪怕PID为1都不行
4、docker0
当我们启动一个容器时我们不指定的情况下容器默认会放置在了一个docker桥上,它默认使用的网络地址是172.17.0.0/16网段,而docker0自己的地址则是172.17.0.1
5、显示当前系统支持的网络接口
#docker network ls
[root@bogon ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
756201332f10 bridge bridge local
cd91840ca853 host host local
d31eeeae3853 none null local
6、进入docker容器运行命令
#docker container exec = docker exec
[root@bogon ~]# docker container exec -it redis /bin/sh //连入redis容器内部的shell接口
/data # ps aux
PID USER TIME COMMAND
1 redis 0:01 redis-server
12 root 0:00 /bin/sh
17 root 0:00 ps aux
/data # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN
tcp 0 0 :::6379 :::* LISTEN
/data # exit
注意:退出容器此时容器不会终止,因为容器还有redis-server,exit终止的只是/bin/sh,只有终止pid为1的进程容器才会停止
7、不进入容器交互式接口,在宿主机上查看该容器监听的端口
#docker container exec 容器名 netstat -tnl
[root@bogon ~]# docker container exec redis netstat -tul
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN
tcp 0 0 :::6379 :::* LISTEN
8、在容器外部停止容器
#docker stop
[root@bogon ~]# docker stop redis
redis
9、删除容器
#docker rm
[root@bogon ~]# docker rm redis
redis
注意:我们此刻删除容器内部的数据也将不存在,正常情况下容器数据都保存在容器自己的名称空间中,删除容器时务必要小心
10、获取docker日志
docker容器中一个容器只运行一个进程,它可以让容器把进程发给控制台,只要连入控制台就能查看日志,查看容器内部日志直接使用docker container logs连入控制台直接访问,注意docker日志是直接发往终端的没有记录在文件当中,主要便于集中统一日志收集平台来收集日志
#docker container logs 容器名称
[root@bogon ~]# docker container logs web
172.17.0.1 - - [04/Aug/2020:09:39:55 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
11、显示容器运行时资源占用情况(消耗的cpu,内存)
# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
8b9898aef4a9 web 0.00% 1.395MiB / 972.3MiB 0.14% 1.28kB / 1.27kB 0B / 0B 2
75665fe0aa94 ningx-1 0.00% 1.867MiB / 972.3MiB 0.19% 1.44kB / 2.09kB 0B / 0B 3
12、显示指定容器内所有进程的相关信息
#docker container top
[root@bogon ~]# docker container top web
UID PID PPID C STIME TTY TIME CMD
root 4123 4107 0 17:09 ? 00:00:00 nginx: master process nginx -g daemon off;
100 4150 4123 0 17:09 ? 00:00:00 nginx: worker process
二、docker image
1、docker image
Docker镜像中含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器
采用分层构建机制,最底层为bootfs,其之为rootfs
a:bootfs 用于系统引导的文件系统,包括bootliader和kernel,容器启动完成后会被卸载以节约内存资源
b:rootfs 位于bootfs之上,表现为docker容器的根文件系统
传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为只读模式
docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层
2、Docker image layer
位于下层的镜像称为父镜像(parent image),最底层的称为基础镜像(base image)
最上层为“可读写”层,其下层的均为“只读”层
3、Docker Registry
启动容器时,docker daemon会试图从本地获取相关镜像,本地镜像不存在时,其将从 Registry中下载该镜像并保存到本地
Docker Registry中的镜像通常由研发人员制作,而后推送至“公共”或者“私有”Registry上保存,供其它人员使用,例如部署到生产环境:
注意:生产环境中我们不要随意从其它地方下载镜像使用,除非这个镜像特别可靠,不然可能下载下来的镜像里被植入挖矿的代码之类
4、利用已有镜像层如何做镜像
<1>首先去docker hub上去创建一个镜像仓库
<2>利用已有镜像去做镜像(在容器可写层中做一些修改,而后把修改结果保存成一个单独的层就可以成为镜像)
[root@bogon ~]# docker image pull busybox:latest //先下载一个busybox镜像
[root@localhost ~]# docker image pull busybox:latest
latest: Pulling from library/busybox
61c5ed1cbdf8: Pull complete
Digest: sha256:4f47c01fa91355af2865ac10fef5bf6ec9c7f42ad2321377c21e844427972977
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
[root@localhost ~]# docker run --name b1 -it busybox /bin/sh //运行容器 在容器中做一个简单修改
/ # ls
bin dev etc home proc root sys tmp usr var
/ # mkdir /data //在容器内创建data目录
/ # mkdir /data/web/html -p //在容器内创建 /data/web/html目录
/ # vi /data/web/html/index.html //写一个测试网页
我们把上面修改过的busybox容器保存为镜像
[root@localhost ~]# docker container commit b1 572232220/myimg:v0.1 //基于b1容器去打包镜像并打标签
sha256:6dae971ed21d860aad31129fc3e5e74cc26f1e67f04e4cdc3db08c06ac09a3e3
[root@localhost ~]# docker image ls //查看打包好的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
572232220/myimg v0.1 6dae971ed21d 7 seconds ago 1.22MB
busybox latest 018c9d7b792b 8 days ago 1.22MB
注意我们在打包镜像时有些镜像还在运行中,直接打包会打包不完整,这时我们可以用commit命令的-p选项表示做镜像时先暂停不再让程序往上写数据,这样可以确保我们得到的是一个一致的数据结构
测试:我们现在使用打包好的镜像572232220/myimg去运行容器
[root@localhost ~]# docker run --name mybbox1 -it 572232220/myimg:v0.1
/ # ls
bin data dev etc home proc root sys tmp usr var
/ # ls /data/web/html/
index.html
/ # cat /data/web/html/index.html
<h1>Test Page @Busybox Web Server</h1>
5、镜像上传到Docker hub
[root@localhost ~]# docker login //输入用户名和密码登录Docker hub
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: 572232220
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@localhost ~]# docker push 572232220/myimg:v0.1 //推送镜像到docker hub
The push refers to repository [docker.io/572232220/myimg]
5a2f2a526c37: Pushed
514c3a3e64d4: Pushed
v0.1: digest: sha256:43c192e9b32d97112a1362e2690828ba7d43f95c33e4ed76917dd15dd1be7ce5 size: 734
登录docker hub查看镜像