一、docker简介
Docker 是一个开源的应用容器引擎,于 2013 年由 Solomon Hykes 推出并开源。它基于 Go 语言开发,遵从 Apache2.0 协议。Docker 可以让开发者将应用及其依赖包打包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上。
Docker 构建在 LXC(Linux Containers)之上,是一种轻量级的虚拟化技术。与传统虚拟机相比,Docker 容器更加轻量级,启动速度通常只需几秒钟,资源占用少,一台主机上可以同时运行数千个 Docker 容器。
Docker 容器具有以下特点:
- 文件系统隔离:每个进程容器运行在完全独立的根文件系统里。
- 资源隔离:可以使用 cgroup 为每个进程容器分配不同的系统资源,如 CPU 和内存。
- 网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和 IP 地址。
- 写时复制:采用写时复制方式创建根文件系统,部署快捷,节省内存和硬盘空间。
- 日志记录:收集和记录每个进程容器的标准流,用于实时检索或批量检索。
- 变更管理:容器文件系统的变更可以提交到新的映像中,重复使用以创建更多容器,无需模板或手动配置。
- 交互式 Shell:可以分配一个虚拟终端并关联到任何容器的标准输入上。
Docker 的发展历程分为起源阶段和发展阶段。起源阶段是 2008 年至 2013 年,由 Solomon Hykes、Kamel Founadi 和 Sebastien Pahl 在巴黎创立了 DotCloud 公司,旨在为软件开发人员提供云托管服务,2013 年推出了工具 Docker 并开源。发展阶段是 2014 年至 2016 年,Docker 引入了 Docker Compose 和 Docker Swarm,成立了 Docker 开放容器倡议(OCI),推出了 Docker for Mac 和 Docker for Windows 等。
Docker 在现代软件开发和部署中具有重要作用,它可以简化配置、管理代码流水线、提高开发效率、提供一致的运行环境、优化资源利用、具有良好的隔离性和安全性、可移植性和跨平台性,易于扩展和管理。在 DevOps 和持续集成 / 持续部署(CI/CD)、微服务架构等领域有广泛应用。
docker与虚拟机对比
二、docker的部署
本实验在rhel9环境下配置
配置软件仓库
# cd /etc/yum.repos.d
# vim docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0
传输并下载软件包
[root@docker-node1 ~]# ls
anaconda-ks.cfg docker.tar.gz
[root@docker-node1 ~]# tar zxf docker.tar.gz
[root@docker-node1 ~]# ls
anaconda-ks.cfg docker-ce-cli-27.1.2-1.el9.x86_64.rpm
containerd.io-1.7.20-3.1.el9.x86_64.rpm docker-ce-rootless-extras-27.1.2-1.el
docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm docker-compose-plugin-2.29.1-1.el9.x8
docker-ce-27.1.2-1.el9.x86_64.rpm docker.tar.gz
[root@docker-node1 ~]# dnf install *.rpm -y
注意:rhel9下载时需要删除runc软件包
[root@docker-node1 ~]# yum remove runc
[root@docker-node1 ~]# docker pull busybox
Using default tag: latest
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: reque connection (Client.Timeout exceeded while awaiting headers)
由于网络不佳,拉取镜像源超时
在阿里云查找镜像加速器,并写入配置文件
[root@docker-node1 docker]# vim daemon.json
再次尝试拉取镜像源
也可使用下载好的安装包拉去,效率更快
[root@docker-node1 ~]# ls
anaconda-ks.cfg
busybox-latest.tar.gz
containerd.io-1.7.20-3.1.el9.x86_64.rpm
docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm
docker-ce-27.1.2-1.el9.x86_64.rpm
docker-ce-cli-27.1.2-1.el9.x86_64.rpm
docker-ce-rootless-extras-27.1.2-1.el9.x86_64.rpm
docker-compose-plugin-2.29.1-1.el9.x86_64.rpm
docker.tar.gz
game2048.tar.gz
mario.tar.gz
nginx-latest.tar.gz
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 5ef79149e0ec 5 weeks ago 188MB
busybox latest 65ad0d468eb1 16 months ago 4.26MB
timinglee/game2048 latest 19299002fdbe 7 years ago 55.5MB
timinglee/mario latest 9a35a9e43e8c 9 years ago 198MB
运行nginx镜像源
[root@docker-node1 ~]# docker run -d --rm --name webserver -p 80:80 nginx
09c091e024d1aab16af31ffc3e16f0ad1667cebee1d464fffc3771422b816a53
[root@docker-node1 ~]# docker rm -f webserver
webserver
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker-node1 ~]# docker run -d --rm --name game1 -p 80:80 timinglee/game2048:latest
414bffb6699f4137590a0abf9c038629dda009d2e601916d2bd7a52953007b7c
[root@docker-node1 ~]# docker rm -f game1
game1
[root@docker-node1 ~]# docker run -d --rm --name game2 -p 80:8080 timinglee/mario:latest
28073e3277f38fdec2bae5cb1085bb02fbaae152f4e075880910d39960e147b2
进入到容器并退出
[root@docker-node1 ~]# docker run -it --name test busybox
/ #
/ # date
Sat Sep 21 03:26:30 UTC 2024
/ # exit
[root@docker-node1 ~]# docker rm test
test
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED
在容器中执行命令
相关参数
-d # 后台运行
-i # 交互式运行
-t # 打开一个终端
--name # 指定容器名称
-p # 端口映射 -p 80 : 8080 把容器 8080 端口映射到本机 80 端口
--rm # 容器停止自动删除容器
--network # 指定容器使用的网络
三、docker镜像构建
构建参数
相关参数示例:
[root@docker-node1 docker]# mkdir docker/
[root@docker-node1 docker]# cd docker/
[root@docker-node1 docker]# ls
[root@docker-node1 docker]# vim Dockerfile
构建一个基础镜像
注意不要忘记符号“.”
指定文件名
docker build -f /root/docker/timingle -t busybox:v4 .
[root@docker-node1 docker]# vim Dockerfile
可替代参数LABEL KEY=VALUE
此时,没有警告出现
#ADD
[root@Docker-node1 docker]#touch leefile{1..3}
[root@Docker-node1 docker]#tar zcf leefile.gz leefile*
[root@Docker-node1 docker]#vim Dockerfile
FROM busybox
MAINTAINER lee@timinglee.org
COPY leefile /
ADD leefile.gz /
[root@Docker-node1 docker]#docker build -t example:v2
#ENV CMD
FROM busybox
MAINTAINER ee@timinglee.org
ENV NAME lee
[root@Docker-nodel docker]# docker run -it --rm --name test example:v3 1ee
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
CMD ["/bin/echo", "$NAME"]
[root@Docker-nodel docker]# docker run -it --rm --name test example:v3 $NAME
#ENV CMD
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
CMD ["/bin/sh","-c","/bin/echo $NAME"]
[root@Docker-nodel docker]# docker run -it --rm --name test example:v3 lee
Dockerfile构建企业实例
使用centos7系统
[root@docker-node1 ~]# docker run -it --rm centos:7
[root@a43e892b111a /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@a43e892b111a ~]# cd /etc/yum.repos.d/
[root@a43e892b111a yum.repos.d]# rm -fr *
[root@a43e892b111a yum.repos.d]# ls
[root@a43e892b111a yum.repos.d]# vi centos.repo
[root@a43e892b111a ~]# [root@docker-node1 ~]#
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a43e892b111a centos:7 "/bin/bash" 8 minutes ago Up 8 minutes sweet_dirac
[root@docker-node1 ~]# dnf install httpd -y
[root@docker-node1 ~]# vim /etc/httpd/conf/httpd.conf
[root@docker-node1 ~]# mkdir /var/www/html/centos7
[root@docker-node1 ~]# mount /dev/sr0 /var/www/html/centos7/
mount: /var/www/html/centos7: WARNING: source write-protected, mounted read-only.
[root@docker-node1 ~]# ls
anaconda-ks.cfg docker-ce-rootless-extras-27.1.2-1.el9.x86_64.rpm
busybox-latest.tar.gz docker-compose-plugin-2.29.1-1.el9.x86_64.rpm
centos-7.tar.gz docker.tar.gz
containerd.io-1.7.20-3.1.el9.x86_64.rpm game2048.tar.gz
docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm mario.tar.gz
docker-ce-27.1.2-1.el9.x86_64.rpm nginx-1.23.tar.gz
docker-ce-cli-27.1.2-1.el9.x86_64.rpm nginx-latest.tar.gz
[root@docker-node1 centos7]# docker run -it --rm centos:7
[root@4f451ce23f5b /]# [root@docker-node1 centos7]# docker run -it --rm centos:7
[root@825c0ee01010 /]# [root@docker-node1 centos7]#
[root@docker-node1 centos7]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
825c0ee01010 centos:7 "/bin/bash" 12 seconds ago Up 12 seconds serene_cori
4f451ce23f5b centos:7 "/bin/bash" 27 seconds ago Up 27 seconds sweet_jang
[root@docker-node1 centos7]# docker rmi 825c0ee01010
Error response from daemon: No such image: 825c0ee01010:latest
[root@docker-node1 centos7]# docker commit -m "add repo" serene_cori centos7:v1
sha256:7817b85b46b3ea33d9d98762adb6cb72cd5fb3a600742ef69fff8c0aa9a4a81b
[root@docker-node1 centos7]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
825c0ee01010 centos:7 "/bin/bash" 5 minutes ago Up 5 minutes serene_cori
4f451ce23f5b centos:7 "/bin/bash" 5 minutes ago Up 5 minutes sweet_jang