Docker

1. Docker的基本概念

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

docker_logo.jpg

docker_logo.jpg

Docker的核心思想就是来自集装箱;集装箱的概念是隔离货物,所以docker的核心就是隔离机制。同时docker使用可移植镜像所以部署以及运维极其方便快捷。


2. 容器是如何工作的

容器通过四个主要组件工作: 名称空间(Namespaces)控制组(CGroups)映像(Images)用户空间工具,如LXC或docker

每个容器都是从镜像建立的,镜像告诉Docker容器内包含了什么,当容器启动时运行什么程序,还有许多配置数据。Docker镜像是只读的,当Docker运行一个从镜像建立的容器,它会在镜像顶部添加一个可读写的层,应用程序可以在这里运行。


Namespaces

命名空间(Namespaces)是Linux内核针对实现容器虚拟化而引入的一个强大特性。

每个容器都可以拥有自己独立的命名空间,运行其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器间彼此互不影响。


CGroup的功能

CGroups(Control Groups)最初叫 Process Container,由 Google 工程师(Paul Menage 和 Rohit Seth)于 2006 年提出,后来因为 Container 有多重含义容易引起误解,就在 2007 年更名为 Control Groups,并被整合进 Linux 内核。顾名思义就是把进程放到一个组里面统一加以控制。

CGroups 是 Linux 内核提供的一种机制,这种机制可以根据特定的行为,把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。

过去有一段时间,内核开发者甚至把 namespace 也作为一个 CGroups 的 subsystem 加入进来,也就是说 CGroups 曾经甚至还包含了资源隔离的能力。但是资源隔离会给 CGroups 带来许多问题,如 PID 在循环出现的时候 CGroup 却出现了命名冲突、CGroup 创建后进入新的 namespace 导致脱离了控制等等。所以在 2011 年就被移除了。


3. LXC介绍

LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求

LXC虽然极大的简化了容器技术的使用,但比起直接通过内核调用来使用容器技术,其复杂程度其实并没有多大降低。后来就出现了docker,所以从一定程度上来说,docker就是LXC的增强版


4. Docker架构

docker提供了一个专门容纳容器镜像的站点:hub.docker.com

img

5. Docker的使用

# 配置好docker的yum源以及环境
[root@localhost ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost ~]# dnf clean all		//清楚缓存
[root@localhost ~]# dnf makecache		//建立新的缓存
[root@localhost ~]# dnf -y install docker-ce		//安装docker
# 启动docker
[root@localhost ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@localhost ~]# 
[root@localhost ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2022-04-24 16:07:11 CST; 4s ago
     Docs: https://docs.docker.com
 Main PID: 12739 (dockerd)
    Tasks: 8
   Memory: 28.9M
   CGroup: /system.slice/docker.service
           └─12739 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

[root@localhost ~]# ls /etc/docker/
key.json
# 配置docker加速
[root@localhost ~]# cat > /etc/docker/daemon.json <<EOF
> {
>     "registry-mirrors": ["https://j3m2itm3.mirror.aliyuncs.com"]
> }
> EOF
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker

docker路径:/var/lib/docker

[root@localhost ~]# docker search httpd			//搜索镜像
NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
httpd                                The Apache HTTP Server Project                  3976      [OK]       
centos/httpd-24-centos7              Platform for running Apache httpd 2.4 or bui…   44                   
centos/httpd                                                                         35                   [OK]
hypoport/httpd-cgi                   httpd-cgi                                       2                    [OK]
solsson/httpd-openidc                mod_auth_openidc on official httpd image, ve…   2                    [OK]
manageiq/httpd                       Container with httpd, built on CentOS for Ma…   1                    [OK]
lead4good/httpd-fpm                  httpd server which connects via fcgi proxy h…   1                    [OK

......

或者可以在网页上进行查找所需的镜像hub.docker.com
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wt9zDeYE-1650804573348)(E:\App\Typora\Typora\picture\image-20220424191934165.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y9nvlWcM-1650804573349)(E:\App\Typora\Typora\picture\image-20220424192004927.png)]


# 配置防火墙策略,放行http协议
[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=0.0.0.0/0 service name=http accept' --permanent
success
[root@localhost ~]# firewall-cmd --reload		//重新加载防火墙规则
success
[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: no
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
	rule family="ipv4" source address="0.0.0.0/0" service name="http" accept
# 拉取镜像
[root@localhost ~]# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
a2abf6c4d29d: Pull complete 
dcc4698797c8: Pull complete 
41c22baa66ec: Pull complete 
67283bbdd4a0: Pull complete 
d982c879c57e: Pull complete 
Digest: sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
# 查看本地镜像
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
httpd        latest    dabbfbe0c57b   4 months ago   144MB
# 创建镜像
[root@localhost ~]# docker create --name web -p 80:80 httpd
19a2532596fd61cfad3034b4369848c6dd6d9f489fb637aeea3563ea7bf8c881
# 查看所有的容器
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS    PORTS     NAMES
19a2532596fd   httpd     "httpd-foreground"   48 seconds ago   Created      
# 启动容器
[root@localhost ~]# docker start web
web
[root@localhost ~]# ss -antl
State       Recv-Q      Send-Q            Local Address:Port             Peer Address:Port      Process      
LISTEN      0           128                     0.0.0.0:22                    0.0.0.0:*                      
LISTEN      0           128                     0.0.0.0:80                    0.0.0.0:*                      
LISTEN      0           128                        [::]:22                       [::]:*                      
LISTEN      0           128                        [::]:80                       [::]:*   
[root@localhost ~]# docker ps		//查看已启动的容器
CONTAINER ID   IMAGE     COMMAND              CREATED              STATUS         PORTS                               NAMES
19a2532596fd   httpd     "httpd-foreground"   About a minute ago   Up 3 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   web

网页输入IP地址,出现这个页面说明成功启动httpd服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-grPMi5ab-1650804573350)(E:\App\Typora\Typora\picture\image-20220424200151287.png)]

# 重启容器
[root@localhost ~]# docker restart web
web
# 停止容器
[root@localhost ~]# docker stop web
web
# 查看容器的日志
[root@localhost ~]# docker logs web
# 强行关闭容器
[root@localhost ~]# docker kill web
web
# 删除容器
[root@localhost ~]# docker rm web
web
# 自动创建运行容器并进入;-it交互模式
# 退出容器将会自动关闭
[root@localhost ~]# docker run -it --name test busybox /bin/sh
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
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    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
/ # exit			//退出
[root@localhost ~]# docker start test		//启动容器
test 
[root@localhost ~]# docker attach test		//进入容器
/ # 
# exec命令进入容器就算退出容器也不会停止运行
[root@localhost ~]# docker exec -it test /bin/sh	//进入容器
/ # 
/ # exit
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS          PORTS     NAMES
bb4a32b48ac0   busybox   "/bin/sh"   5 minutes ago   Up 29 seconds             test
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐