Docker
一、Docker 介绍
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。和其它软件一样,docker也分为企业版和社区版,一般管理一些小应用,比如说我要将我的项目制成镜像,一般用社区版就行了。
Docker是有三部分组成,分别为镜像(Image)、容器(Container)和仓库(Repository)。
二、基础配置
虚拟机centos,关闭防火墙和se。别自己配置yum源。
三、下载 Docker
#Docker 镜像源
wget -O /etc/yum.repos.d/doker.repo https://download.docker.com/linux/centos/docker-ce.repo
#下载docker
yum install docker-ce -y
#启动docker
systemctl start docker
#开机自启
systemctl enable docker
#查看docker是否安装完成
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
四、仓库镜像管理
注册 dockerhub:https:hub.docker.com
#把镜像推送到账号下面:
docker login docker.in
输入:ID
输入:密码
#搜索镜像nginx
docker search nginx
#搜索系统alpine
docker search alpine
#下载nginx镜像
[root@docker ~]# docker pull nginx
#下载系统alpine
[root@docker ~]# docker pull alpine:3.12.3
#查看有多少镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c316d5a335a5 22 hours ago 142MB
alpine latest c059bfaa849c 2 months ago 5.59MB
alpine 3.12.3 389fef711851 13 months ago 5.58MB
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c316d5a335a5 22 hours ago 142MB
alpine latest c059bfaa849c 2 months ago 5.59MB
alpine 3.12.3 389fef71185 13 months ago 5.58MB
#打标签
[root@docker ~]# docker tag 389fef711851 docker.io/xmfreexm/alpine:v3.12.3
#打完标签的样子
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c316d5a335a5 22 hours ago 142MB
alpine latest c059bfaa849c 2 months ago 5.59MB
alpine 3.12.3 389fef711851 13 months ago 5.58MB
xmfree/alppine v3.12.3 389fef711851 13 months ago 5.58MB
#删除标签 删除两个的时候需要-f
[root@docker ~]# docker rmi -f 389fef711851
#推送到库里 需要docker login docker.io
[root@docker ~]# docker push docker.io/xmfreexm/alppine:v3.12.3
#会报这样的错
The push refers to repository [docker.io/xmfreexm/alpine]
777b2c648970: Layer already exists
errors:
denied: requested access to the resource is denied
#docker tag 需要上传的镜像[:TAG] [docker hub自己注册的账号名]/镜像名[:TAG]
[root@docker ~]# docker tag c316d5a335a5 nicehuahua/nginx:77
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c316d5a335a5 23 hours ago 142MB
nicehuahua/nginx 77 c316d5a335a5 23 hours ago 142MB
alpine latest c059bfaa849c 2 months ago 5.59MB
alpine 3.12.3 389fef711851 13 months ago 5.58MB
#推送成功
[root@docker ~]# docker push docker.io/nicehuahua/nginx:77
The push refers to repository [docker.io/nicehuahua/nginx]
762b147902c0: Mounted from library/nginx
235e04e3592a: Mounted from library/nginx
6173b6fa63db: Mounted from library/nginx
9a94c4a55fe4: Mounted from library/nginx
9a3a6af98e18: Mounted from library/nginx
7d0ebbe3f5d2: Mounted from library/nginx
77: digest:sha256:bb129a712c2431ecce4af8dde831e980373b26368233ef0f3b2bae9e9ec515ee size: 1570
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c316d5a335a5 23 hours ago 142MB
alpine latest c059bfaa849c 2 months ago 5.59MB
#启动nginx
[root@docker ~]# docker run -ti --name nginx -d nginx
d06d433801f78c1943695360116d86cb39b762102c45a1af37ca5ef898a273cf
#查看容器是否启动
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d06d433801f7 nginx "/docker-entrypoint.…" 5 seconds ago Up 3 seconds 80/tcp nginx
#通过容器创建镜像 -a:提交的作者 -m:提交时的注释
[root@docker ~]# docker commit -a "cool" -m "this is test" d06d433801f7 nginx1.0
sha256:c00839526b2336b7ece201f4782c1d314ad1bfb26adb140d9356d104b635d124
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx1.0 latest c00839526b23 2 minutes ago 142MB //这个就是
nginx latest c316d5a335a5 23 hours ago 142MB
alpine latest c059bfaa849c 2 months ago 5.59MB
[root@docker ~]# docker run -dti --name nginx1.0 -p 80:80 nginx
862b43b2da6e744b8514ca1eee5a96651da35b0299a8952a4940e280f8220080
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
862b43b2da6e nginx "/docker-entrypoint.…" 7 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp nginx1.0
d06d433801f7 nginx "/docker-entrypoint.…" 9 minutes ago Up 9 minutes 80/tcp nginx
[root@docker ~]# netstat -an |grep ":80"
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp6 0 0 :::80 :::* LISTEN
去访问自己的IP:80端口会发现nginx页面!!!这是把nginx映射到了80端口。
#停止 06d433801f7 容器
[root@docker ~]# docker stop 862b43b2da6e
#启动
[root@docker ~]# docker start 862b43b2da6e
#进入容器
[root@docker ~]# docker exec -it 862b43b2da6e /bin/sh
# ls
bin docker-entrypoint.d home media proc sbin tmp
boot docker-entrypoint.sh lib mnt root srv usr
dev etc lib64 opt run sys var
# exit //退出容器
#导出容器 可以看出容器快照是在root目录下
[root@docker ~]# docker export 862b43b2da6e > ngixn1.0.tar
[root@docker ~]# ls
anaconda-ks.cfg ngixn1.0.tar
#删除容器
[root@docker ~]# docker rm -f 862b43b2da6e
#把容器快照导入镜像 开启即可
[root@docker ~]# cat ngixn1.0.tar |docker import - nginx1:1.0.1
sha256:f3df3c13c02e3a9004e06241c17e31c991642779df3d80d1920dfabe63990def
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx1 1.0.1 f3df3c13c02e 7 seconds ago 140MB //这个就是
nginx1.0 latest c00839526b23 4 hours ago 142MB
nginx latest c316d5a335a5 27 hours ago 142MB
alpine latest c059bfaa849c 2 months ago 5.59MB
数据卷
数据卷:数据卷就是将宿主的某个目录,映射到容器中,作为数据储存的目录,我们就可以在宿主机对数据进行储存。
#创建数据卷目录,在这个目录里添加一个文件文件里写了test
[root@docker ~]# mkdir /data
[root@docker ~]# echo "test" > /data/test.txt
#启动容器,挂载数据卷
[root@docker ~]# docker run -dti --name test1 -v /data:/data nginx
eee768c020059bca4cea711b027185a092f4f9a985157a1025f7152b384cef70
[root@docker ~]# docker ps
eee768c02005 nginx "/docker-entrypoint.…" 16 seconds ago Up 15 seconds 80/tcp
#进入容器内
[root@docker ~]# docker exec -it eee768c02005 /bin/bash
root@eee768c02005:/# ls /data
test.txt
root@eee768c02005:/# cat /data/test.txt
test
数据卷容器:数据卷容器需要再多个容器之间共享一些持续更新的数据,最简单的方式就是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷提供其他容器挂载。
#创建数据卷容器v-data1
[root@docker ~]# docker create -v /data1 --name v-data1 nginx
#创建两个容器 //意思是:v01容器通过挂载v-data1容器中创建数据卷来实现共享
[root@docker ~]# docker run --volumes-from v-data1 -dti --name v01 nginx
ba2f9e932d0afca7c0c38fe88f88884c91761d234e034565fe15a72eb00e0de4
[root@docker ~]# docker run --volumes-from v-data1 -dti --name v02 nginx
a6d153fa47104e846079f2b40f0056a6f156a51a853a7b328ea6a4ae998a1868
#进入v01容器 可以看root,录下是有data1共享文件夹的
[root@docker ~]# docker exec -ti ba2f9e932d0a /bin/bash
root@ba2f9e932d0a:/# ls
bin dev etc lib64 opt run sys var
boot docker-entrypoint.d home media proc sbin tmp
data1 docker-entrypoint.sh lib mnt root srv usr //这不data1文件
root@ba2f9e932d0a:/# echo "aihuahua" > /data1/gm.txt //#创建一个带有内容的文件、去v02看看有没有
root@ba2f9e932d0a:/# exit //退出
[root@docker ~]# docker exec -it a6d153fa4710 /bin/bash //进入v02容器
root@a6d153fa4710:/# cat /data1/gm.txt //查看是有v01留下的内容
aihuahua
-
-
host 模式
-
none 模式
-
他是docker默认的网络模式,不写 --net 参数,就是 brige 模式。使用 docker run -p 时,docker实际是在 iptables 做了 DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnl查看。也就是网桥模式。
#创建有网络的容器 不加 --network 默认是网桥模式不加也行
[root@docker ~]# docker run -it --network bridge busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
5cc84ad355aa: Pull complete
Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
Status: Downloaded newer image for busybox:latest
/ #ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
16: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:06 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.6/16 brd 172.17.255.255 scope global eth0 //可以看到已经自己分配了IP
valid_lft forever preferred_lft forever
/ # exit
[root@docker ~]# ifconfig //可以看到跟 docker0 是在一个段上
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:ff:fe78:1aee prefixlen 64 scopeid 0x20<link>
ether 02:42:00:78:1a:ee txqueuelen 0 (Ethernet)
RX packets 15 bytes 2175 (2.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22 bytes 2242 (2.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
host 模式:使用 host 模式的容器可以直接使用宿主机的IP与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host 最大的优势就是网络性能比较好,但是 docker host上已经使用的端口就不能再用了,网络的隔离性不好。
#创建host模式的容器 可以看到跟宿主机的ip一样,也就说明他没有自己的ip网卡
[root@docker ~]# docker run -it --network host busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:a7:01:5c brd ff:ff:ff:ff:ff:ff
inet 192.168.100.111/24 brd 192.168.100.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::6c54:c9c3:84ae:8548/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
link/ether 02:42:00:78:1a:ee brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:ff:fe78:1aee/64 scope link
valid_lft forever preferred_lft forever
7: veth49cbf4c@if6: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0
link/ether be:a0:f7:bf:d7:62 brd ff:ff:ff:ff:ff:ff
inet6 fe80::bca0:f7ff:febf:d762/64 scope link
valid_lft forever preferred_lft forever
11: veth9ccc5e3@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0
link/ether 8e:71:bb:61:9f:d5 brd ff:ff:ff:ff:ff:ff
inet6 fe80::8c71:bbff:fe61:9fd5/64 scope link
valid_lft forever preferred_lft forever
13: veth6801f79@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0
link/ether 0a:c1:28:80:c8:1d brd ff:ff:ff:ff:ff:ff
inet6 fe80::8c1:28ff:fe80:c81d/64 scope link
valid_lft forever preferred_lft forever
15: veth43f383c@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0
link/ether f2:8b:68:93:ac:84 brd ff:ff:ff:ff:ff:ff
inet6 fe80::f08b:68ff:fe93:ac84/64 scope link
valid_lft forever preferred_lft forever
1.使用none模式,Docker容器拥有自己的NAwork Namespace,但是,并不 为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、iP、 路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
2.这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器 创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的 网络能很好的保证容器的安全性。
#创建 none 网络
[root@docker ~]# docker run -it --network none busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
/ #
如果有一个容器是生产随机密码那么 none 模式是最安全的。
自定义网络模式
系统默认的IP地址段自动向后递增。
#创建一个名字为 my_net 的自定义网卡
[root@docker ~]# docker network create --driver bridge my_net
1d25cd338fb08156a729812a7eeb16e6d69cc66c0a0e418c92aeda9659fffa59
[root@docker ~]# ifconfig
br-1d25cd338fb0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
ether 02:42:1c:57:9f:6f txqueuelen 0 (Ethernet)
RX packets 15 bytes 2385 (2.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 25 bytes 2452 (2.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#创建一个自定义网络的容器 //仔细观察IP地址是2了
[root@docker ~]# docker run --network my_net -it busybox
/ # ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
19: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #