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

八、网络管理

  1. brige 模式

  2. host 模式

  3. none 模式

  4. 自定义模式

brige 模式

他是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 模式:使用 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

None 模式

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
/ #
posted @ 2022-05-09 10:30  蜡笔小新๑  阅读(46)  评论(0编辑  收藏  举报