Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker_logo.jpg
Docker的核心思想就是来自集装箱;集装箱的概念是隔离货物,所以docker的核心就是隔离机制。同时docker使用可移植镜像所以部署以及运维极其方便快捷。
容器通过四个主要组件工作: 名称空间(Namespaces), 控制组(CGroups), 映像(Images)和用户空间工具,如LXC或docker
每个容器都是从镜像建立的,镜像告诉Docker容器内包含了什么,当容器启动时运行什么程序,还有许多配置数据。Docker镜像是只读的,当Docker运行一个从镜像建立的容器,它会在镜像顶部添加一个可读写的层,应用程序可以在这里运行。
命名空间(Namespaces)是Linux内核针对实现容器虚拟化而引入的一个强大特性。
每个容器都可以拥有自己独立的命名空间,运行其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器间彼此互不影响。
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 年就被移除了。
LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求
LXC虽然极大的简化了容器技术的使用,但比起直接通过内核调用来使用容器技术,其复杂程度其实并没有多大降低。后来就出现了docker,所以从一定程度上来说,docker就是LXC的增强版
docker提供了一个专门容纳容器镜像的站点:hub.docker.com
# 配置好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 <
> {
> "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
# 配置防火墙策略,放行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
# 重启容器
[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