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三大核心概念
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命令导入,成为镜像
容器的状态变化
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网络最常使用的模式。
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 模式能够和其它模式共存
container 模式
Container 网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。
启动另一个容器,并使用第一个容器的 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