rhel7.3-docker安装和容器基本管理

一.Docker

Docker 是一个开源的应用容器引擎,主要利用 linux 内核 namespace 实现沙盒隔离,用cgroup 实现资源限制。让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。由于其基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资源占用小。docker能够只加载每个container变化的部分,这样资源占用小,能够在单机环境下与KVM之类的虚拟化方案相比能够更加快速和占用更少资源。隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库。Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用。和宿主机共用一部分资源,内核要求在3.10以上。

docker容器是docker镜像的实例化,docker容器开启方便,即创即用,随着要求进行删除添加。国内有很多容器云服务服务商:华为云,阿里云,时速云,腾讯云。近几年云服务是大热门,几乎各大厂商都有参与。镜像用来创建容器,是容器的只读模板,默认可以从 docker hub 上下载。docker 的镜像是增量修改,每次创建新的镜像都会在父镜像上构建一个增量的层,基于 AUFS 技术。

二.容器管理

1.docker的安装(用的rhel7.3的yum源)
下载docker以及相关依赖

yum install -y *
container-selinux-2.21-1.el7.noarch.rpm
docker-ce-18.06.1.ce-3.el7.x86_64.rpm
libsemanage-2.5-8.el7.x86_64.rpm
libsemanage-python-2.5-8.el7.x86_64.rpm
pigz-2.3.4-1.el7.x86_64.rpm
policycoreutils-2.5-17.1.el7.x86_64.rpm
policycoreutils-python-2.5-17.1.el7.x86_64.rpm

启动docker

systemctl start docker

查看当前docker信息

[root@server6 docker]# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.06.1-ce
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 468a545b9edcd5932818eb9de8e72413e616e86e
runc version: 69663f0bd4b60df09991c08812a60108003fa340
init version: fec3683
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-514.el7.x86_64
Operating System: Red Hat Enterprise Linux Server 7.3 (Maipo)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 992.7MiB
Name: server6
ID: WGDT:45ZS:F53A:2KVR:35ZJ:Z6RL:WDBZ:MGF2:2Z7O:5AET:RGWD:24UD
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

2.内核要求3.10以上

[root@server6 docker]# uname -r
3.10.0-514.el7.x86_64

3.容器的基本操作

(1)导入镜像,创建容器

docker load -i 镜像的tar包

[root@server6 images]# docker load -i ubuntu.tar
56abdd66ba31: Loading layer  196.8MB/196.8MB
9468150a390c: Loading layer  208.9kB/208.9kB
11083b444c90: Loading layer  4.608kB/4.608kB
5f70bf18a086: Loading layer  1.024kB/1.024kB
Loaded image: ubuntu:latest
[root@server6 images]# docker load -i rhel7.tar
e1f5733f050b: Loading layer  147.1MB/147.1MB
[root@server6 images]# docker load -i nginx.tar
014cf8bfcb2d: Loading layer  58.46MB/58.46MB
832a3ae4ac84: Loading layer  53.91MB/53.91MB
e89b70d28795: Loading layer  3.584kB/3.584kB
Loaded image: nginx:latest

(2)docker images ##查看本地镜像

[root@server6 images]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              e548f1a579cf        12 months ago       109MB
ubuntu              latest              07c86167cdc4        2 years ago         188MB
rhel7               latest              0a3eb3fde7fd        4 years ago         140MB

创建ubuntu (-it 交互式)

[root@server6 images]# docker run -it --name vm1 ubuntu
root@50cbbef57bb9:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
##启动容器,没启动加 docker ps -a查看
[root@server6 images]# docker start vm1
vm1
[root@server6 images]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
50cbbef57bb9        ubuntu              "/bin/bash"         3 minutes ago       Up 2 seconds                            vm1
##进入这个容器
[root@server6 images]# docker container attach vm1
root@50cbbef57bb9:/# 
root@50cbbef57bb9:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
##退出容器不关闭容器crtl+p+q 
##退出容器关闭容器crtl+d+q

(3)基于nginx镜像创建容器

[root@server6 images]# docker run -d nginx
a274e9248f699a4da9dda45111923d499890d9a177ba06395a683a4b7a372559
[root@server6 images]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
a274e9248f69        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds        80/tcp              pensive_goldwasser
50cbbef57bb9        ubuntu              "/bin/bash"              15 minutes ago      Up 3 minutes                            vm1

(4)创建容器的发布文件,把发布文件复制到容器

[root@server6 images]# cd /tmp/
[root@server6 tmp]# ls
[root@server6 tmp]# mkdir docker
[root@server6 tmp]# cd docker/
[root@server6 docker]# vim index.html
[root@server6 docker]# cat index.html 
server6
[root@server6 docker]# docker container cp index.html a2:/usr/share/nginx/html

(4)docker inspect a2 ##查看容器详情

[root@server6 docker]# docker inspect a2 ##a2是nginx的id前两位,也可以输全id
               .....中间省略一部分.....
                    "NetworkID": "60dca791efa06c41630b0df5e7b17d3b7b5fb7924be4ff8274923406b7a954e2",
                    "EndpointID": "0ec953ef240ebd502e80289c7b329bc0ae09a04b1e7c7d9e9c628ea4e3454e51",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]
[root@server6 images]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
a274e9248f69        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds        80/tcp              pensive_goldwasser
50cbbef57bb9        ubuntu              "/bin/bash"              15 minutes ago      Up 3 minutes                            vm1

(5)测试

[root@server6 docker]# curl 172.17.0.3
server6

相关命令

docker top vm1    ##查看容器进程
docker logs vm1   ##查看容器指令输出
docker stats  vm1   ##查看容器资源使用率
docker diff vm1   ##查看容器修改
docker stop vm1   ##停止容器
docker start vm1 启动容器
docker kill vm1 强制干掉容器
docker restart vm1 重启容器
docker pause/unpause vm1    暂停/恢复容器
docker rm -f vm1    删除容器
docker export vm1 > vm1.tar   ##导出容器

4.容器的四种网络模式
bridge 桥接模式、host 模式、container 模式和 none 模式。启动容器时可以使用 --net 参数指定,默认是桥接模式。bridge桥接模式: Docker Container 在使用时,并非为开发者包办了一切。最明显的是,该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。

host 模式:bridge 桥接模式很好的补充。采用 host 模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。

[root@server6 docker]# docker run -it --name vm1 --net host ubuntu
root@server6:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@server6:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:f0:ae:21 brd ff:ff:ff:ff:ff:ff
    inet 172.25.21.6/24 brd 172.25.21.255 scope global ens3
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fef0:ae21/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:7a:bd:3d:71 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:7aff:febd:3d71/64 scope link 
       valid_lft forever preferred_lft forever

Container 网络模式:
(1) 查找 other container(即需要被共享网络环境的容器)的网络 namespace;

(2)将新创建的DockerContainer(也是需要共享其他网络的容器)的 namespace,使用other container 的 namespace
vm4通过Container 网络模式共享vm1的网络环境

[root@server6 docker]# docker run -it --name vm3 ubuntu
root@dd40fd5b5266:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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
14: eth0@if15: <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
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
root@dd40fd5b5266:/# [root@server6 docker]# 
[root@server6 docker]# docker run -it --name vm4 --net container:vm3 ubuntu
root@dd40fd5b5266:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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
14: eth0@if15: <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
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
root@dd40fd5b5266:/# 

None 网络模式:

网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。

[root@server6 docker]# docker run -it --name vm2 --net none ubuntu
root@3f227611164f:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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

获取容器的PID

[root@server6 docker]# docker inspect vm1 | grep Pid
            "Pid": 14103,
            "PidMode": "",
            "PidsLimit": 0,

你可能感兴趣的:(rhel7.3-docker安装和容器基本管理)