docker实战(一):centos7 yum安装docker
绿色出现,关注优质资源..................................
Docker组成
Docker的组成部分docker类似于cs结构
Docker Client
Docker Server
我们可以将docker启动
比喻成Docker server
,我们执行命令的时候相当于Docker client
默认情况下,docker会创建一个桥接网卡[docker 0],docker有2种映射方式,一种是随机映射,一种是指定映射.生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突
======================================================
一、Docker网络设置
默认情况下,docker
会创建一个桥接网卡[docker 0]
,docker有2种映射方式,一种是随机映射,一种是指定映射
提示:生产场景一般不使用随机映射
,但是随机映射的好处就是由docker分配
,端口不会冲突
案例1:使用docker启动nginx随机映射
配置
[root@docker-02 ~]# docker run -d -P nginx
c766dd075329785635b90a894822466f2c897b5b943465321e7b17700c3bd638
[root@docker-02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c766dd075329 nginx "nginx -g 'daemon ..." 21 seconds ago Up 20 seconds 0.0.0.0:32768->80/tcp wonderful_bhaskara
提示:物理机的32769被映射到80端口
-P代表随机映射
http://192.168.227.132:32768/
我们可以查看我们的端口
我们可以看一下iptables查看Nat表
docker默认会使用dhcp分配IP地址,但是我们如果想访问到需要设置iptables
我们可以使用docker logs [ID/Name]
来查看日志
案例2:使用docker启动一个nginx,指定91
端口
[root@docker-02 ~]# docker run -d -p 192.168.227.132:91:80 --name mynginx nginx
313b19ade1de8709d064482b901408233711622203291a03a077adc826d00f3c
[root@docker-02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
313b19ade1de nginx "nginx -g 'daemon ..." 10 seconds ago Up 10 seconds 192.168.227.132:91->80/tcp mynginx
c766dd075329 nginx "nginx -g 'daemon ..." 45 minutes ago Up 45 minutes 0.0.0.0:32768->80/tcp wonderful_bhaskara
5c7b37d5c51f centos "/bin/bash" 3 days ago Exited (0) 2 days ago my-test提示: -d代表后台运行 -p 指定端口 --name 指定名称
访问如下:
通过端口映射,我们就可以非常方便的去访问到容器内部的服务
案例3:docker 启动映射多端口
[root@docker-02 ~]# docker run -d -p 443:443 -p 92:80 --name nginxv2 nginx
0f8b52c7db4ed5229ed5ad571d65a7128c37e6a4f91e415696b661b8a958b24c
[root@docker-02 ~]# docker port nginxv2
443/tcp -> 0.0.0.0:443
80/tcp -> 0.0.0.0:92
二、Docker数据管理
Docker数据分为两种:
数据卷: -v /data
-v src:dst
数据卷容器: --volumes-from
可以将数据卷理解为挂载,可以将数据mount到docker镜像中,让我在docker镜像里写数据时,实际写入的是物理主机里面。如果容器多了,不方便管理
数据卷设置
案例:我们创建一个容器,起名叫nginx-volume-test
挂载到容器中的/data
目录下
[root@docker-02 ~]# docker run -d --name nginx-volume-time -v /data nginx
a8d0a913f8a3b33b674a76b258895b42bf8506b29ab51c5778755027b7c58834
进入容器,目录下已经有我们data目录
[root@docker-02 ~]# docker exec -it nginx-volume-time /bin/bash
root@a8d0a913f8a3:/# ls
bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
看到刚才我们挂载的数据目录data
我们可以查看当前挂载目录
root@a8d0a913f8a3:/data# mount
overlay on / type overlay (rw,relatime,seclabel,lowerdir=/var/lib/docker/overlay2/l/EL3ILRSJQ4PICSYIHELJAAAC7V:/var/lib/docker/overlay2/l/LIQXIO6LLOY6QBZMZHOESYOH3Y:/var/lib/docker/overlay2/l/VOHPHJVE4AQLYY7EIKVBONVT4H:/var/lib/docker/overlay2/l/EGMK6TTANNVN6VWTWXQLNJABZR,upperdir=/var/lib/docker/overlay2/309617d12cde1b0a28533a3f1dca603eea81af6a774b349065d7a0f412ed7806/diff,workdir=/var/lib/docker/overlay2/309617d12cde1b0a28533a3f1dca603eea81af6a774b349065d7a0f412ed7806/work)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev type tmpfs (rw,nosuid,seclabel,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=666)
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime,seclabel)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,relatime,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (ro,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpuacct,cpu type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/freezer type cgroup (ro,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/blkio type cgroup (ro,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/net_cls type cgroup (ro,nosuid,nodev,noexec,relatime,net_cls)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (ro,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/devices type cgroup (ro,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/memory type cgroup (ro,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/perf_event type cgroup (ro,nosuid,nodev,noexec,relatime,perf_event)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime,seclabel)
/dev/mapper/centos-var on /data type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/mapper/centos-var on /etc/resolv.conf type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/mapper/centos-var on /etc/hostname type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/mapper/centos-var on /etc/hosts type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel,size=65536k)
/dev/mapper/centos-var on /run/secrets type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
proc on /proc/bus type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/fs type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/irq type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)
tmpfs on /proc/acpi type tmpfs (ro,relatime,seclabel)
tmpfs on /proc/kcore type tmpfs (rw,nosuid,seclabel,mode=755)
tmpfs on /proc/keys type tmpfs (rw,nosuid,seclabel,mode=755)
tmpfs on /proc/timer_list type tmpfs (rw,nosuid,seclabel,mode=755)
tmpfs on /proc/timer_stats type tmpfs (rw,nosuid,seclabel,mode=755)
tmpfs on /proc/sched_debug type tmpfs (rw,nosuid,seclabel,mode=755)
tmpfs on /proc/scsi type tmpfs (ro,relatime,seclabel)
tmpfs on /sys/firmware type tmpfs (ro,relatime,seclabel)
提示:虽然我们不知道mount到哪里,但是在却有date目录
我们可以通过docker inspect
来查看mount
的情况
[root@docker-02 ~]# docker inspect -f {{.Mounts}} nginx-volume-time
[{volume 1462c3690dc6677d0e7af3b35d182845aca911345f72ce5571bc16f2ea74ed10 /var/lib/docker/volumes/1462c3690dc6677d0e7af3b35d182845aca911345f72ce5571bc16f2ea74ed10/_data /data local true }]
mount挂载就是我们下面路径下的内容
[root@docker-02 ~]# cd /var/lib/docker/volumes/1462c3690dc6677d0e7af3b35d182845aca911345f72ce5571bc16f2ea74ed10/_data
[root@docker-02 _data]# pwd
/var/lib/docker/volumes/1462c3690dc6677d0e7af3b35d182845aca911345f72ce5571bc16f2ea74ed10/_data
我们可以在这个文件下创建一个文件,然后在进容器中进行查看
[root@docker-02 _data]# touch yhdocker.txt
[root@docker-02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a8d0a913f8a3 nginx "nginx -g 'daemon ..." 19 minutes ago Up 19 minutes 80/tcp nginx-volume-time
0f8b52c7db4e nginx "nginx -g 'daemon ..." 27 minutes ago Up 27 minutes 0.0.0.0:443->443/tcp, 0.0.0.0:92->80/tcp nginxv2
313b19ade1de nginx "nginx -g 'daemon ..." 33 minutes ago Up 33 minutes 192.168.227.132:91->80/tcp mynginx
c766dd075329 nginx "nginx -g 'daemon ..." About an hour ago Up About an hour 0.0.0.0:32768->80/tcp wonderful_bhaskara
5c7b37d5c51f centos "/bin/bash" 3 days ago Exited (0) 2 days ago my-test
[root@docker-02 ~]# docker exec -it nginx-volume-time /bin/bash
root@a8d0a913f8a3:/# ls /data/
abcdocker.txt
我们还可以使用-v
指定一个卷用来作为存储
我们可以创建一个目录,用来指定。
exit
[root@docker-02 ~]# cd /var/lib/docker/volumes/1462c3690dc6677d0e7af3b35d182845aca911345f72ce5571bc16f2ea74ed10/_data
[root@docker-02 _data]# mkdir -p /data/docker-volume-nginx
[root@docker-02 _data]# docker run -d --name nginx-volume-test2 -v /data/docker-volume-nginx/:/data nginx
e5cfd987f975d62a5e64b36b6e097e7787dea4869a910f3b08ca303f1c0f191b
提示:-v /data/docker-volume-nginx 存储文件的目录 data 容器中的目录
查看
[root@docker-02 ~]# docker exec -it nginx-volume-test2 /bin/bash
root@e5cfd987f975:/# ls /data/1.txt
/data/1.txt
提示:这种方法生产上会比较实用一些,但是这种方式dockerfile
里不支持.因为这种方法不可移植
我们可以添加几个参数
[root@docker-02 ~]# cd /var/lib/docker/volumes/1462c3690dc6677d0e7af3b35d182845aca911345f72ce5571bc16f2ea74ed10/_data
[root@docker-02 _data]# docker run -d --name nginx-volume-test3 -v /data/docker-volume-nginx/:/data:ro nginx
e614383a89318952b51bfd829b19eb72ebd1f58797e6f90bc17b1cb0a7044a41
# 添加ro代表只读,可以使用只读的方式来挂载
容器还可以挂载文件
例如:我们挂载一个.bash_history
,挂载完并删除
[root@docker-02 _data]# docker run --rm -it -v /root/.bash_history:/.bash_history nginx /bin/bash
root@0d8abcbbb930:/# head .bash_history
ifconfi
ifconfig
yum search ifconfig
yum install net-tools.x86_64
ifconfig
ip route
clear
hostname
vi /etc/hostname
reboot
现在如果我们退出这个容器就会关闭
容器数据之间同步
案例:
[root@docker-02 ~]# docker run -d --name nfs -v /root/nfs-data:/data nginx 30c74a55685050027316347b6de20058af3665fb87b1fd7bca14e7316e8e900e [root@docker-02 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 30c74a556850 nginx "nginx -g 'daemon off" 4 seconds ago Up 4 seconds 80/tcp, 443/tcp nfs b2bef96c8330 nginx "nginx -g 'daemon off" 2 hours ago Up 2 hours 80/tcp, 443/tcp nginx-volume-test2 e3356d281a09 nginx "nginx -g 'daemon off" 3 days ago Up 3 days 80/tcp, 443/tcp nginx-volume-time [root@docker-02 ~]# docker run --rm -it --volumes-from nfs centos /bin/bash [root@1a29a9cdffdf /]# cd /data/ [root@1a29a9cdffdf data]# ls [root@1a29a9cdffdf data]# touch 123456567 切换进去查看 [root@docker-02 ~]# cd nfs-data/ [root@docker-02 nfs-data]# ls 123456567
数据卷容器
数据卷容器就是可以让一个容器访问另一个容器的卷,不管这个容器是否运行都可以访问到。
数据卷容器简单解释就是:它可以让这个数据在多个容器中共享
[root@docker-02 ~]# docker run -it --rm --name volume-test3 --volumes-from nginx-volume-test2 centos /bin/bash
[root@3498004e9a1f /]#
--volumes-from 另一个容器的名称
此时我们可以看到根目录下有data目录,因为默认是没有的
[root@docker-02 ~]# docker run -it --rm --name volume-test3 --volumes-from nginx-volume-test2 centos /bin/bash
[root@3498004e9a1f /]# ls /data/1.txt
/data/1.txt
现在我们可以访问到nginx-volume-test2
下面挂载的目录,这就实现类似nfs的功能
提示:我们现在如果停掉test2
一样可以访问,数据卷容器还有一个好处是不管这个容器是否运行都会起作用,只要有容器在使用数据卷容器就无法删除
over!!!!!!!!!!!!!!!!!!!!!!