前言
什么是Docker容器?
容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。
Docker 借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker 将这个模 型运用到自己的设计中,唯一不同的是:集装箱运输货物,而 Docker 运输软件。和集装箱一样,Docker 在执行上述操作时,并不关心容器中到底装了什么,它不管是 web 服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将 内容“装载”进去。
一 . 容器创建与删除
1.1 查看镜像
[root@docker2 opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 7 days ago 133MB
[root@docker2 opt]# docker create -it nginx:latest /bin/bash
d9850fa13e2e1422fc9e0ce690d30f6977852f8d6bb858d51e151ebe09d3e891
1.2 查看容器
[root@docker2 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9850fa13e2e nginx:latest "/docker-entrypoint.…" 14 seconds ago Created heuristic_mccarthy
1.3 启动容器
[root@docker2 opt]# docker start d9850fa13e2e
d9850fa13e2e
1.4 查看状态,变成 up 运行状态
[root@docker2 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9850fa13e2e nginx:latest "/docker-entrypoint.…" 2 minutes ago Up 4 seconds 80/tcp heuristic_mccarthy
1.5 停止容器
[root@docker2 opt]# docker stop f04aeae9e8d1
1.6 下载centos7 镜像
先搜索资源
[root@docker2 opt]# docker search centos7
NAME DESCRIPTION
ansible/centos7-ansible Ansible on Centos7
flyceek/centos7-jdk centos7-jdk
ryanj/centos7-s2i-nodejs STOP RUNNING YOUR APP BUILDS AS ROOT
paigeeworld/centos7 Centos7 with apache, iperf3, nmap, s
在 根据镜像名称进行下载
[root@docker2 opt]# docker pull paigeeworld/centos7
Using default tag: latest
latest: Pulling from paigeeworld/centos7
Image docker.io/paigeeworld/centos7:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
a3ed95caeb02: Pull complete
查看镜像
[root@docker2 opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 7 days ago 133MB
paigeeworld/centos7 latest 4cbe7aa905e7 6 years ago 382MB
1.7 创建 centos7 的容器
[root@docker2 opt]# docker create -it paigeeworld/centos7 /bin/bash
f04aeae9e8d172df5c1efcc5344516f31b4eabd2bc7b8b4ca3fb34535ec86b91
查看容器状态
[root@docker2 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f04aeae9e8d1 paigeeworld/centos7 "/bin/bash" 2 minutes ago Created distracted_ptolemy
d9850fa13e2e nginx:latest "/docker-entrypoint.…" 11 minutes ago Up 9 minutes 80/tcp heuristic_mccarthy
开启容器
[root@docker2 opt]# docker start f04aeae9e8d1
f04aeae9e8d1
[root@docker2 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f04aeae9e8d1 paigeeworld/centos7 "/bin/bash" 3 minutes ago Up 3 seconds distracted_ptolemy
d9850fa13e2e nginx:latest "/docker-entrypoint.…" 12 minutes ago Up 10 minutes 80/tcp heuristic_mccarthy
停止容器
[root@docker2 opt]# docker stop f04aeae9e8d1
f04aeae9e8d1
[root@docker2 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f04aeae9e8d1 paigeeworld/centos7 "/bin/bash" 4 minutes ago Exited (137) 3 seconds ago distracted_ptolemy
d9850fa13e2e nginx:latest "/docker-entrypoint.…" 13 minutes ago Up 11 minutes 80/tcp heuristic_mccarthy
1.8 查看centos7镜像的 根目录下 有哪些文件
[root@docker2 opt]# docker run paigeeworld/centos7 /usr/bin/bash -c ls /
bin
boot
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
相当于之前的docker run 命令 执行了 又创建了一个centos7 的容器,然后运行它,并查看了其根目录,然后又关闭了它 的操作
[root@docker2 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb475fdf03ed paigeeworld/centos7 "/usr/bin/bash -c ls…" About a minute ago Exited (0) About a minute ago determined_borg
f04aeae9e8d1 paigeeworld/centos7 "/bin/bash" 8 minutes ago Exited (137) 3 minutes ago distracted_ptolemy
d9850fa13e2e nginx:latest "/docker-entrypoint.…" 16 minutes ago Up 14 minutes 80/tcp heuristic_mccarthy
在一台没有centos7镜像的 设备上操作
docker run 命令 执行了 先自动下载镜像文件, 又创建了一个centos7 的容器,然后运行它,并查看了其根目录,然后又关闭了它 的操作
[root@SERVER 10 opt]# docker run paigeeworld/centos7 /usr/bin/bash -c ls /
Unable to find image 'paigeeworld/centos7:latest' locally
latest: Pulling from paigeeworld/centos7
Image docker.io/paigeeworld/centos7:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
a3ed95caeb02: Pull complete
7235103339cf: Pull complete
c962e85f182c: Pull complete
e945c72281a4: Pull complete
bd558d66c6e0: Pull complete
b6d31d07a319: Pull complete
Digest: sha256:356b32d72680f0b9e0489af16961b2c3de74e18cbd391ffcf5ab085997fedf2b
Status: Downloaded newer image for paigeeworld/centos7:latest
bin
boot
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@SERVER 10 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c35c9b8be3b paigeeworld/centos7 "/usr/bin/bash -c ls…" 17 seconds ago Exited (0) 17 seconds ago dreamy_panini
1.9 进入容器查看
格式
docker exec -it ID 号 /bin/bash
(必须先运行容器,或容器已处于运行状态)
[root@docker2 opt]# docker start f04aeae9e8d1
f04aeae9e8d1
[root@docker2 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb475fdf03ed paigeeworld/centos7 "/usr/bin/bash -c ls…" 24 minutes ago Exited (0) About a minute ago determined_borg
f04aeae9e8d1 paigeeworld/centos7 "/bin/bash" 30 minutes ago Up 2 seconds distracted_ptolemy
d9850fa13e2e nginx:latest "/docker-entrypoint.…" 39 minutes ago Up 37 minutes 80/tcp heuristic_mccarthy
进入容器
[root@docker2 opt]# docker exec -it f04aeae9e8d1 /bin/bash
bash-4.2# ls
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
bash-4.2#
容器的退出
bash-4.2# exit
exit
[root@docker2 opt]# docker stop f04aeae9e8d1
f04aeae9e8d1
[root@docker2 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb475fdf03ed paigeeworld/centos7 "/usr/bin/bash -c ls…" 26minutes ago Exited (0) 4 minutes ago determined_borg
f04aeae9e8d1 paigeeworld/centos7 "/bin/bash" 33 minutes ago Exited (137) 15 seconds ago distracted_ptolemy
d9850fa13e2e nginx:latest "/docker-entrypoint.…" 42minutes ago Up 40 minutes 80/tcp heuristic_mccarthy
让容器持续在后台运行
通过设置死循环,让容器一直运行,-d 守护进程
[root@docker2 opt]# docker run -d paigeeworld/centos7 /bin/bash -c “while true;do echo hello;done”
c06add1ec27df716c02929b5edd893c3690247c1b0de1ac875598fffd4d78757
会发现容器一直处于运行状态
[root@docker2 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c06add1ec27d paigeeworld/centos7 “/bin/bash -c 'while…” 45 seconds ago Up 44 seconds jolly_chatterjee
9cae901fe6ed paigeeworld/centos7 “/bin/bash -c 'while…” 12 minutes ago Exited (1) 12 minutes ago fervent_feistel
bb475fdf03ed paigeeworld/centos7 “/usr/bin/bash -c ls…” 41 minutes ago Exited (0) 19 minutes ago determined_borg
f04aeae9e8d1 paigeeworld/centos7 “/bin/bash” 48 minutes ago Exited (137) 15 minutes ago distracted_ptolemy
d9850fa13e2e nginx:latest “/docker-entrypoint.…” 57 minutes ago Up 55 minutes 80/tcp heuristic_mccarthy
停止运行容器
[root@docker2 opt]# docker stop c06add1ec27d
c06add1ec27d
[root@docker2 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c06add1ec27d paigeeworld/centos7 "/bin/bash -c 'while…" 3 minutes ago Exited (137) 10 seconds ago joll
二. 容器的导出 和 导入
2.1 导出容器
[root@docker2 opt]# ls
containerd nginx rh
[root@docker2 opt]# docker export d9850fa13e2e > nginx_c
[root@docker2 opt]# ls
containerd nginx nginx_c rh
[root@docker2 opt]# scp nginx_c root@192.168.100.10:/opt
root@192.168.100.10's password:
nginx_c 100% 129MB 130.9MB/s 00:00
[root@docker2 opt]#
2.2 在另一台服务器导入容器
先根据模板生成新镜像
[root@SERVER 10 opt]# cat nginx_c | docker import - nginx:web
sha256:b2732e94c331a809dbdac585bb8df86ec298e35a99db1f29200cdbc8d3c4d205
[root@SERVER 10 opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx web b2732e94c331 5 seconds ago 131MB
[root@SERVER 10 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
根据新镜像加载到容器
[root@SERVER 10 opt]# docker create -it nginx:web /bin/bash
95ab1d44b0c46b2f3a4ac4436b1b0236a5c6b67907fa87e78ea442907b95634e
[root@SERVER 10 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95ab1d44b0c4 nginx:web "/bin/bash" 10 secondsago Created practical_lichterman
[root@SERVER 10 opt]# docker start 95ab1d44b0c4
95ab1d44b0c4
[root@SERVER 10 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95ab1d44b0c4 nginx:web "/bin/bash" 4 minutes ago Up 3 minutes practical_lichterman
三 .批量删除
首先 过滤 出容器列表
[root@docker2 opt]# docker ps -a | awk '{print "decker rm "$1}'
decker rm CONTAINER
decker rm c06add1ec27d
decker rm 9cae901fe6ed
decker rm bb475fdf03ed
decker rm f04aeae9e8d1
decker rm d9850fa13e2e
加入 删除指令,通过bash 环境执行
(在运行的容器不会删除,因为会报错提示,此命令用于批量删除未使用的容器)
[root@docker2 opt]# docker ps -a | awk '{print "docker rm "$1}' | bash
Error: No such container: CONTAINER
c06add1ec27d
9cae901fe6ed
bb475fdf03ed
f04aeae9e8d1
docker container prune 效果一样
docker rm $(docker ps -a | awk ‘{print $1}’) 效果一样
docker rm -f $(docker ps -a | awk ‘{print $1}’) 强制删除所有容器
四. 数据卷与数据卷容器
4.1 数据卷,用的还是宿主机的空间 ,与宿主机共享空间
-v 数据卷 ,宿主机的路径:容器中的路径 建立了互相关联 创建了名为WEB1的容器使用了centos 镜像
[root@docker1 apache]# docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
[root@443744cf30b3 /]# ls
anaconda-post.log data1 etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
[root@443744cf30b3 /]# cd data1
[root@443744cf30b3 data1]# touch abc.txt
[root@443744cf30b3 data1]#
文件数据共享
[root@docker1 apache]# cd /var/www
[root@docker1 www]# ls
[root@docker1 www]# ls
[root@docker1 www]# ls
[root@docker1 www]# ls
abc.txt
宿主机创建CDE,查看容器空间
[root@docker1 www]# touch cde.txt
[root@docker1 www]# ls
abc.txt cde.txt
在容器中查看,同样存在
[root@443744cf30b3 data1]# ls
abc.txt cde.txt
[root@443744cf30b3 data1]#
数据卷 只要在宿主机更改数据就可以达到更新 容器数据的目的
4.2 数据卷容器
//数据卷容器
有两个数据卷容器进行提供,利用了centos镜像
[root@docker2 ~]# docker run --name web100 -v /data1 -v /data2 -it centos /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
[root@bc0dbbdd3408 /]# ls
bin data2 etc lib lost+found mnt proc run srv tmp var
data1 dev home lib64 media opt root sbin sys usr
[root@bc0dbbdd3408 /]# cd data1
[root@bc0dbbdd3408 data1]# echo "12345" > test1.txt
[root@bc0dbbdd3408 data1]# cd ../
[root@bc0dbbdd3408 /]# ls
bin data2 etc lib lost+found mnt proc run srv tmp var
data1 dev home lib64 media opt root sbin sys usr
[root@bc0dbbdd3408 /]# cd data2
[root@bc0dbbdd3408 data2]# echo "45678" > test2.txt
[root@bc0dbbdd3408 data2]# ls
test2.txt
[root@bc0dbbdd3408 data2]# cd ../data1
[root@bc0dbbdd3408 data1]# ls
test1.txt
[root@bc0dbbdd3408 data1]# exit
exit
新容器挂载数据卷容器web100,名字叫db1
[root@docker2 ~]# docker run -it --volumes-from web100 --name db1 centos /bin/bash
[root@0b152c50576d /]# ls
bin data2 etc lib lost+found mnt proc run srv tmp var
data1 dev home lib64 media opt root sbin sys usr
查看目录,发现数据已达到了同步的目的
[root@0b152c50576d /]# cd data1
[root@0b152c50576d data1]# ls
test1.txt
[root@0b152c50576d data1]# cd data2
bash: cd: data2: No such file or directory
[root@0b152c50576d data1]# cd data2
bash: cd: data2: No such file or directory
[root@0b152c50576d data1]# cd ../
[root@0b152c50576d /]# cd data2
[root@0b152c50576d data2]# ls
test2.txt
数据卷容器 用在WEB群集数据更新,只要更新一个站点就好
五. 容器互联
创建并运行容器取名web1,端口号自动映射
[root@docker2 apache]# docker run -itd -P --name web11 centos:7 /bin/bash
075e9cdd940e8a3a4d21694d1572f417c90d67bcfd60fab64f0f8a72e79b6aae
创建并运行容器取名web2,链接到web1和其通信,端口号自动映射
web11:web:11 名字和别名
[root@docker2 apache]# docker run -itd -P --name web22 --link web11:web11 centos:7/bin/bash
21db10af75fe22a48b47a259a260b7d6d69336e9a2a087a6255e9e508d4f33ee
[root@docker2 apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21db10af75fe centos:7 "/bin/bash" 5 seconds ago Up 4 seconds web22
075e9cdd940e centos:7 "/bin/bash" About a minute ago Up About a minute web11
进入 容器web22 测试
[root@docker2 apache]# docker exec -it 21db10af75fe /bin/bash
[root@21db10af75fe /]# ping web11
PING web11 (172.17.0.4) 56(84) bytes of data.
64 bytes from web11 (172.17.0.4): icmp_seq=1 ttl=64 time=0.077 ms
64 bytes from web11 (172.17.0.4): icmp_seq=2 ttl=64 time=0.043 ms
64 bytes from web11 (172.17.0.4): icmp_seq=3 ttl=64 time=0.044 ms
64 bytes from web11 (172.17.0.4): icmp_seq=4 ttl=64 time=0.122 ms
64 bytes from web11 (172.17.0.4): icmp_seq=5 ttl=64 time=0.081 ms
64 bytes from web11 (172.17.0.4): icmp_seq=6 ttl=64 time=0.178 ms
64 bytes from web11 (172.17.0.4): icmp_seq=7 ttl=64 time=0.044 ms
场景:我们无需暴露 web12 的情况下,让web12应用使用web11
[root@docker2 ~]# docker exec -it web11 /bin/bash
[root@075e9cdd940e /]# ping web12
ping: web12: Name or service not known
[root@075e9cdd940e /]#