Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。和其它软件一样,docker也分为企业版和社区版,一般管理一些小应用,比如说我要将我的项目制成镜像,一般用社区版就行了。
Docker是有三部分组成,分别为镜像(Image)、容器(Container)和仓库(Repository)
基础配置虚拟机centos,关闭防火墙和se
下载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 389fef711851 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网络管理
- brige模式
- 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:host模式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: 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 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 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:none模式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: 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: 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: 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: 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: 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: 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: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=4099mtu 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: 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: 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 / #



