Docker容器技术
- 安装docker
mirrors.aliyun.com
[root@docker-01 ~]# ls /etc/yum.repos.d/
CentOS-Base.repo docker-ce.repo
//可以使用以下命令列出可用版本,选择安装不同版本。//默认安装最新版
$ yum list docker-ce --showduplicates | sort -r
$ sudo yum install docker-ce-<VERSION STRING>
//安装好docker,设置成开机自启。
[root@docker-01 ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@docker-01 ~]# systemctl start docker
[root@docker-01 ~]# 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 Tue 2023-05-23 17:02:27 CST; 3min 55s ago
Docs: https://docs.docker.com
//测试。检查docker是否正确安装并运行hello-world镜像
[root@docker-01 ~]# docker run hello-world
//运行一个容器
[root@docker-01 ~]# docker run -d -p 80:80 httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
9e3ea8720c6d: Pull complete
35c516cd98eb: Pull complete
3050fa5900bc: Pull complete
f14b7012c455: Pull complete
014a91cb6174: Pull complete
Digest: sha256:90254ccc7352e1a5c8d1e4cdab2a032cefac9fd5d4d632ca003a2943c9a9b0a3
Status: Downloaded newer image for httpd:latest
15d950759fae0ef253bc22d0fad1387d5897d1d2e6d5c17f41c26e81321af652
[root@docker-01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15d950759fae httpd "httpd-foreground" 5 minutes ago Up 5 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp romantic_matsumoto
//访问浏览器192.168.70.106
//继续启动两个阿帕奇服务,并访问192.168.70.106:82
[root@docker-01 ~]# docker run -d -p 81:80 httpd
247a0d24936c0ec1abce153f9c9bf852d3b3c823b36ced22054cf2bfb1561131
[root@docker-01 ~]# docker run -d -p 82:80 httpd
b7f2079ff8f5e2703269c778614f33af6e0c15d6ebc06a6a065c9b5c78bb0a64
[root@docker-01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b7f2079ff8f5 httpd "httpd-foreground" 24 seconds ago Up 23 seconds 0.0.0.0:82->80/tcp, :::82->80/tcp blissful_hypatia
247a0d24936c httpd "httpd-foreground" 31 seconds ago Up 30 seconds 0.0.0.0:81->80/tcp, :::81->80/tcp optimistic_goldstine
15d950759fae httpd "httpd-foreground" 8 minutes ago Up 8 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp romantic_matsumoto
- 配置镜像加速器 https://www.aliyun.com/
[root@docker-01 ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://imisxb3c.mirror.aliyuncs.com"]
> }
> EOF
{
"registry-mirrors": ["https://imisxb3c.mirror.aliyuncs.com"]
}
[root@docker-01 ~]# cat /etc/docker/daemon.json //查看加速器
{
"registry-mirrors": ["https://imisxb3c.mirror.aliyuncs.com"]
}
[root@docker-01 ~]# systemctl daemon-reload
[root@docker-01 ~]# systemctl restart docker
[root@docker-01 ~]# docker version //查看docker版本
Client: Docker Engine - Community
Version: 24.0.1
API version: 1.43
Go version: go1.20.4
Git commit: 6802122
Built: Fri May 19 18:06:42 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 24.0.1
API version: 1.43 (minimum version 1.12)
Go version: go1.20.4
Git commit: 463850e
Built: Fri May 19 18:05:43 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.21
GitCommit: 3dce8eb055cbb6872793272b4f20ed16117344f8
runc:
Version: 1.1.7
GitCommit: v1.1.7-0-g860f061
docker-init:
Version: 0.19.0
GitCommit: de40ad0
- Docker服务器 需要在配置文件中打开TCP监昕 编辑配置文件/etc/systemd/system/multi-user.target.wants/docker.service,在环境变量ExecStart后面添加-H tcp://0.0.0.0,允许来自任意IP的客户端连接。
[root@docker-01 ~]# vi /etc/systemd/system/multi-user.target.wants/docker.service
[root@docker-01 ~]# systemctl daemon-reload
[root@docker-01 ~]# systemctl restart docker
[root@docker-01 ~]# 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 Tue 2023-05-23 23:05:39 CST; 4min 27s ago
[root@docker-01 ~]# ps -ef | grep docker | grep -v "gep"
root 2563 1 0 23:05 ? 00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0
root 2706 1603 0 23:07 pts/0 00:00:00 grep --color=auto docker
[root@docker-01 ~]# netstat -anptl | grep docker
tcp6 0 0 :::2375 :::* LISTEN 2563/dockerd
[root@docker-01 ~]# docker -H 192.168.70.106 info
Client: Docker Engine - Community
Version: 24.0.1
Context: default
[root@docker-01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest b4f91978e2cc 11 days ago 145MB
hello-world latest 9c7a54a9a43c 2 weeks ago 13.3kB
理论知识点总结
- 容器是一种打包应用的方式,可以帮你打包应用中的所有软件和软件所依赖的环境,并且可以实现跨平台部署。
- 默认情况下,docker命令会使用Unix socket与Docker引擎通讯。而只有root用户和docker组的用户才可以访问Docker引擎的Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用root用户。因此,更好地做法是将需要使用 docker 的用户加入docker用户组。
将当前用户加入docker组:
$ sudo usermod -aG docker $USER 或 gpasswd -a username docker
重启docker后台服务
注销,然后再登陆
[root@docker-01 ~]# ls /var/run/
auditd.pid dmeventd-client lock plymouth tmpfiles.d
console dmeventd-server log sepermit tuned
containerd docker lvm setrans udev
crond.pid docker.pid lvmetad.pid sshd.pid user
cron.reboot docker.sock mount sudo utmp
cryptsetup faillock netreport syslogd.pid vmware
dbus initramfs NetworkManager systemd xtables.lock
- Docker 的核心组件包括:
Docker 客户端:Client
Docker 服务器:Docker daemon
Docker 镜像:Image
Registry:镜像仓库
Docker 容器:Container
- 镜像能提供一个基本的操作系统环境,用户可以根据需要安装和配置软件。这样的镜像我们称作base 镜像。
- base镜像有两层含义:(1)不依赖其他镜像,从scratch 构建; (2)其他镜像可以以之为基础进行扩展。所以,能称作base 镜像的通常都是各种Linux 发行版的Docker 镜像,比如Ubuntu、Debian、CentOS 等。
- rootfs
内核空间是kernel,,Linux刚启动时会加载bootfs 文件系统。
用户空间的文件系统是rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录。
对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。而base镜像,就相当于是一个 root 文件系统。比如 Docker官方镜像ubuntu:14.04 就包含了完整的一套 Ubuntu 14.04 最小系统的 root 文件系统。
而对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了。相比其他 Linux 发行版,CentOS 的 rootfs 已经算臃肿的了,alpine 还不到 10MB。
我们平时安装的 CentOS 除了 rootfs 还会选装很多软件、服务、图形桌面等,需要好几个 GB 就不足为奇了。
- base镜像提供的是最小安装的 Linux 发行版,下面是 CentOS 镜像的 Dockerfile 的内容:
第二行 ADD 指令添加到镜像的 tar 包就是 CentOS 7 的 rootfs。在制作镜像时,这个 tar 包会自动解压到 / 目录下,生成 /dev, /proc, /bin 等目录。
注:可在Docker Hub(https://hub.docker.com/) 的镜像描述页面中查看Dockerfile。