Docker

简介: centos7安装docker1.13.1 docker镜像管理、容器管理 docker数据卷的概念以及创建方式 docker 4种网络模式

1、docker安装

yum install -y docker

#查看安装的版本
docker version [-f {{.Server.Version}}]
docker info
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

参考:https://docs.docker.com/install/linux/docker-ce/centos/

1.1、卸载旧版本

#卸载旧版本(如果安装过旧版本的话)
yum remove docker  docker-common docker-selinux docker-engine

#安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2

#设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#或者:wget https://download.docker.com/linux/centos/docker-ce.repo --no-check-certificate   -P /etc/yum.repos.d/

#可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r

#安装docker
sudo yum install <FQPN>  # 例如:sudo yum install docker-ce-17.12.0.ce

1.2、使用阿里云加速器

针对Docker客户端版本大于 1.10.0 的用户

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://rll3fofp.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2、docker三大核心概念

f17a8d25af4887db31e08b6cea9815ca

a、镜像

docker运行容器前需要本地先存在对应的docker镜像,如果镜像不存在,docker默认去中央仓库(docker hub)拉取镜像。
用户也可以配置自定义的本地docker仓库,如果配置本地仓库,则优先使用本地仓库,本地仓库不存在在最终去中央仓库,类似maven的概念。

镜像管理

docker的管理命令分为11个模块,如下
Management Commands:
  container   Manage containers
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  volume      Manage volumes
使用docker image --help可以查看支持的命令,常用的命令如下。
1、下载镜像
docker pull [options] [localhost:5000/] centos[:lastest]
Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
      --help                    Print usage
localhost:5000/为仓库地址
centos为镜像名称
lastest为tag,如果省略默认为lastest

2、查看镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]

3、查找镜像
docker search centos

4、删除镜像
docker rmi image_id

容器

简单的说,容器是镜像运行的一个实例。

容器管理

1、创建容器
docker create 
docker run
使用docker create创建的容器处于停止状态,可以使用docker start
使用docker run为新建容器并启动容器,创建完后处于运行状态
docker start CONTAINER
docker restart CONTAINER
docker stop CONTAINER
docker pause CONTAINER
docker kill CONTAINER
docker stats CONTAINER 

2、删除容器
docker rm

3、进入容器
docker attach
docker exec

4、容器的迁移与备份
docker export centos > test_for_run.tar
使用docker export命令可以将实现容器的备份,配合docker import可以完成容器的迁移
docker import
导出的文件可以使用docker import命令导入,成为镜像

容器的状态变化
20171208143125220

docker基本命令

docker volume

volume(数据卷)可以将容器以及容器产生的数据分离开,这样,当使用docker rm container_id删除容器,不会影响数据。很多人对volume有个误解,认为volume是为了持久化,对立面这认为容器不能持久化,这样其实不对,容器是持久化的,除非将容器删除,容器中的数据才会丢失。

创建数据卷的方式

1、docker run -v的形式

docker run -it centos /host/path:/contains/path

2、查看docker容器的数据卷挂载情况
[root@k8s-master-101 ~]#  docker inspect 44abf11be31e | grep Mounts -A 10
        "Mounts": [
            {
                "Type": "volume",
                "Name": "86e8fd9103feb1083280538e39353331e270ceb535d2d969b8c92dada09ef24f",
                "Source": "/var/lib/docker/volumes/86e8fd9103feb1083280538e39353331e270ceb535d2d969b8c92dada09ef24f/_data",
                "Destination": "/rcl",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }

#在宿主机中执行
touch /var/lib/docker/volumes/86e8fd9103feb1083280538e39353331e270ceb535d2d969b8c92dada09ef24f/_data/1.txt

docker exec 44abf11be31e 
[root@44abf11be31e /]# ll rcl/
total 0
-rw-r--r--. 1 root root 0 Oct 22 16:33 1.txt


2、使用docker volume管理命令创建
docker volume create --name rcl --lable rcl
docker valume inspect rcl
[
    {
        "Driver": "local",
        "Labels": {
            "[rcl]": ""
        },
        "Mountpoint": "/var/lib/docker/volumes/rcl/_data",
        "Name": "rcl",
        "Options": {},
        "Scope": "local"
    }
]
touch /var/lib/docker/volumes/rcl/_data/2.txt
[root@k8s-master-101 ~]# docker run -it -v rcl:/rcl centos 
[root@5c85901d043d /]# ll /rcl/
total 0
-rw-r--r--. 1 root root 0 Oct 22 16:48 2.txt

3、通过dockerfile volume指令创建
通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。

还有一个区别是,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。

待补充

docker网络

docker有四种网络模式,分别为:bridge模式、host模式、container模式、none模式。
指定网络模式启动容器

docker run --network host
不指定网络模式时默认为:docker run --network bridge

bridge模式

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看

桥接模式是docker网络最常使用的模式。

697113_20160921210314981_2013047548

docker run -it --name centos7 docker.io/centos

在容器中安装iproute工具,以便查看网卡信息
yum install -y iproute
在容器中执行ip addr,可以看到eth0@if5网卡,ip地址为172.17.0.2/16
[root@773cf474fa28 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    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
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever

在主机上安装bridge-utils,以便查看网桥信息
yum install bridge-utils -y
[root@localhost ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.024279b50c05       no              vethb84ae5d
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:d7:84:dd brd ff:ff:ff:ff:ff:ff
    inet 192.168.54.124/24 brd 192.168.54.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fed7:84dd/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:79:b5:0c:05 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:79ff:feb5:c05/64 scope link 
       valid_lft forever preferred_lft forever
5: vethb84ae5d@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP 
    link/ether 5e:eb:f7:1a:22:aa brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::5ceb:f7ff:fe1a:22aa/64 scope link 
       valid_lft forever preferred_lft forever

查看主机到容器的路由
[root@localhost ~]# ip route
default via 192.168.54.1 dev enp0s3 
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 
192.168.54.0/24 dev enp0s3  proto kernel  scope link  src 192.168.54.124 
[root@localhost ~]# ip route get 172.17.0.2
172.17.0.2 dev docker0  src 172.17.0.1 
    cache

查看容器的网路路由
[root@773cf474fa28 /]# ip route
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2 

查看容器详细信息可以看到使用的是bridge模式,网关为docker0网卡的ip。
docker container inspect centos7
"NetworkSettings": {
            "Bridge": "",
            "SandboxID": "4d69456f4aa0d2d14422b36e549db25608e8d5fb72ee8eacfe32873cb8338011",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/4d69456f4aa0",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "764508fb23c3b923d12fb6239c29b4dc108f7aac4fd50bc67204f7039be1d652",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "7afadadafd2affa988e4f409d371668185fd965176e5c8624ba758c2231b39c9",
                    "EndpointID": "764508fb23c3b923d12fb6239c29b4dc108f7aac4fd50bc67204f7039be1d652",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02"
                }
            }
        }
由此可知,主机与容器网络互通,并且网络拓扑如上图所示。

参考:
https://blog.csdn.net/mungo/article/details/73485434?utm_source=gold_browser_extension
http://www.cnblogs.com/sammyliu/p/4622563.html

Host

Host 模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,是因为该模式下的 Docker 容器会和 host 宿主机共享同一个网络 namespace,故 Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。换言之,Docker Container的 IP 地址即为宿主机 eth0 的 IP 地址。其特点包括:

1.这种模式下的容器没有隔离的 network namespace
2.容器的 IP 地址同 Docker host 的 IP 地址
3.需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突
4.host 模式能够和其它模式共存
697113_20160921211323293_119309106

container 模式

Container 网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。
697113_20160921215054012_2042972351

启动另一个容器,并使用第一个容器的 network namespace
docker run -it --name centos72 --network container:centos7

none 模式

网络模式为 none,即不为 Docker 容器构造任何网络环境。一旦Docker 容器采用了none 网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。Docker Container的none网络模式意味着不给该容器创建任何网络环境,容器只能使用127.0.0.1的本机网络.

在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等

Docker文件系统

参考:
http://dockone.io/article/1513
https://www.cnblogs.com/sammyliu/p/5931383.html
https://blog.csdn.net/shlazww/article/details/47283037

http://blog.51cto.com/wzlinux/category16.html
http://blog.51cto.com/ganbing/category21.html

相关文章
|
3月前
|
缓存 Linux 调度
Docker介绍
Docker介绍
85 0
|
3天前
|
JavaScript Linux Docker
【Docker】什么是Docker?
【4月更文挑战第20天】【Docker】什么是Docker?
|
9天前
|
运维 监控 开发者
什么是docker
Docker
12 0
|
7月前
|
关系型数据库 MySQL Docker
|
4月前
|
关系型数据库 MySQL 虚拟化
docker介绍
docker介绍
56 0
|
7月前
|
Linux Docker 容器
|
Linux Docker Python
JupyterNotebook-Docker版
制作jupyter notebook的docker镜像,兼容numpy, pandas, matplotlib, pyspark, opencv-python, requests, flask等组件。
361 0
|
Ubuntu NoSQL Linux
了解和理解Docker的使用
Docker背景 Docker技术是基于Linux容器 虚拟容器技术的 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的
122 0
了解和理解Docker的使用
|
NoSQL jenkins 关系型数据库
你应该学会的docker使用技巧
这是之前在简书写的一篇旧文;没有读过的小伙伴可以读读。
114 0