1. 简介
Docker是一个开源的应用容器引擎,它允许开发者打包他们的应用以及应用的依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 的主要用途包括:
- 简化配置:Docker 可以确保应用的运行环境一致性,从开发到测试再到生产环境,都可以使用相同的容器镜像,大大简化了配置和部署工作。
- 快速部署和扩展:容器可以快速启动,比传统的虚拟机更快。同时,Docker 容器可以在不同的宿主机之间轻松迁移,方便实现应用的扩展和负载均衡。
- 隔离性:每个容器都有自己独立的环境,不会和其他容器共享,从而保证了应用之间的隔离性。
- 资源利用:Docker 容器不需要额外的操作系统层,它们直接运行在宿主机的内核上,因此可以更加高效地利用系统资源。
- 持续集成和持续部署:Docker 可以和现有的持续集成(CI)和持续部署(CD)工具集成,实现自动化测试和部署。
Docker 的核心组件包括:
-
Docker 客户端和服务器:Docker 是一个客户端-服务器(C/S)架构的系统。Docker 客户端与 Docker 守护进程进行通信。
-
Docker 镜像:镜像是一个静态的文件集合,它包含了运行一个容器所需的所有内容,比如程序代码、运行时环境、库、环境变量和配置文件等。镜像是一个构建容器的模板,而容器则是一个镜像的运行实例。当你运行一个容器时,Docker 会使用镜像来创建容器的文件系统。
-
Docker 容器:容器是 Docker 镜像的运行实例,它是一个轻量级的、独立的运行环境,可以运行在几乎任何地方,包括物理机、虚拟机、云服务器等。容器是使用容器引擎(如 Docker)创建和管理的,它们提供了应用程序运行所需的一切,包括代码、运行时环境、系统工具和库。
容器的特点
- 轻量级:容器直接运行在宿主机的内核上,不需要额外的操作系统层,因此比传统的虚拟机更加轻量级。
- 隔离性:容器之间是隔离的,每个容器都有自己的文件系统、网络和进程空间,不会影响到其他容器和宿主机。
- 可移植性:容器可以在不同的环境之间轻松迁移,无论是在本地还是在云端,无论是在 Linux、Windows 还是 macOS 上。
- 快速启动:由于容器不需要启动完整的操作系统,它们可以快速启动,通常在毫秒到秒的级别。
- 资源高效:容器可以更高效地利用系统资源,因为它们不需要为每个应用都分配单独的操作系统实例。
- 一致性:容器确保了开发、测试和生产环境的一致性,因为它们都是基于相同的镜像构建的。
-
Docker 仓库:仓库是存储和分发 Docker 镜像的地方。它类似于代码仓库,如 Git 或 SVN,但是用于存储和分享镜像而不是源代码。Docker 仓库可以用来存储镜像的多个版本,每个版本通过标签(tag)来区分。Docker 仓库可以是公共的,也可以是私有的。公共仓库允许任何人pull(拉取)镜像,而私有仓库通常需要用户验证才能访问。
三个常用的Docker仓库:
- Docker官方仓库:服务器处于国外,下载速度较慢,可以通过换源解决。
- daocloud国内仓库:服务器在国内,下载速度较快,与官方仓库的关系类似于Github和Gitee的关系
- 网易云镜像中心
镜像、容器和仓库三者的关系可以这样理解:开发者创建一个应用,并将其及其依赖环境打包成一个 Docker 镜像;这个镜像被推送到 Docker 仓库中,以便其他人可以访问和使用;当需要运行这个应用时,用户从仓库中拉取相应的镜像到本地;用户使用这个镜像来创建一个或多个容器实例,这些容器可以运行在本地、云端或任何支持 Docker 的环境中;容器启动后,应用就可以在容器内运行,与其他容器隔离,并可以使用宿主机的资源。
2. Docker的安装
安装之前请确保没有装过Docker
验证Docker是否安装
sudo docker --version
如果安装过需先卸载Docker
# 停止 Docker 服务
sudo systemctl stop docker
# 卸载
sudo yum remove docker-ce docker-ce-cli containerd.io
# 删除 Docker 配置文件(可选)
sudo rm -rf /etc/docker
# 删除 Docker 镜像、容器、卷和网络、仓库
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
# 清理未使用的依赖包和yum的缓存(可选)
sudo yum autoremove
sudo yum clean all
安装Docker
-
更新系统包索引:更新系统包索引以确保安装的是最新版本的 Docker
sudo yum update
-
安装依赖包: 安装一些必要的包。这些包将允许你通过 HTTPS 来使用 Docker 仓库
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
-
添加 Docker 仓库: 添加 Docker 的阿里云仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
安装 Docker
sudo yum install docker-ce docker-ce-cli containerd.io
-
启动 Docker 服务: 安装完成后,启动 Docker 服务并设置为开机启动
# 启动 sudo systemctl start docker # 开机自动启动 sudo systemctl enable docker
-
验证 Docker 安装: 通过运行以下命令来验证 Docker 是否成功安装
sudo docker --version # 运行一个简单的 hello-world 容器来验证 Docker 是否正常工作 sudo docker run hello-world
3. 镜像相关命令
-
搜索镜像,在仓库上搜索镜像
docker search [关键词]
-
查看镜像,列出本地存储的镜像
docker images
-
拉去镜像,从仓库中拉取或者更新指定的镜像
docker pull [镜像名]
-
删除镜像,删除一个或多个指定的镜像
docker rmi [镜像名|镜像ID]
-
标记镜像,给镜像添加一个新的标签
docker tag [原镜像名:原标签] [新镜像名:新标签]
-
保存镜像, 将一个或多个镜像保存到 tar 归档文件
docker save [镜像名] > [文件名].tar
-
加载镜像,从 tar 归档文件加载镜像
docker load -i [文件名].tar
-
查看镜像历史,查看指定镜像的构建历史
docker history [镜像名]
-
构建镜像,用于从 Dockerfile 构建一个镜像
docker build -t [镜像名] [Dockerfile路径]
-
推送镜像,将本地的镜像推送到仓库
docker push [镜像名]
4. 容器相关命令
Docker 容器相关的命令主要用于管理 Docker 容器,包括创建、启动、停止、删除、查看状态等操作。以下是一些常用的 Docker 容器相关命令:
-
查看运行中的容器,列出当前所有正在运行的容器
docker ps
-
查看所有容器,列出所有容器,包括未运行的
docker ps -a
-
创建并启动容器,创建一个新的容器并启动
docker run [OPTIONS] [镜像名] [COMMAND] [ARG...]
-
启动已停止的容器,启动一个或多个已经被停止的容器。
docker start [容器名|容器ID]
-
重启容器,重启一个或多个容器
docker restart [容器名|容器ID]
-
端口映射,在容器内映射一个端口到宿主机
docker run -p [宿主机端口]:[容器端口] [镜像名]
-
停止正在运行的容器,停止一个或多个正在运行的容器。
docker stop [容器名|容器ID]
-
删除容器,删除一个或多个容器。
docker rm [容器名|容器ID]
-
停止并删除所有容器,停止所有容器并删除它们
docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)
-
暂停容器,暂停一个或多个容器的所有进程
docker pause [容器名|容器ID]
-
恢复暂停的容器,恢复一个或多个容器内所有被暂停的进程
docker unpause [容器名|容器ID]
-
查看容器日志,获取容器的日志输出。
docker logs [容器名|容器ID]
-
查看容器详细信息,获取容器的详细信息。
docker inspect [容器名|容器ID]
-
进入运行中的容器,在运行的容器中执行命令。
docker exec -it [容器名|容器ID] [COMMAND] [ARG...]
5. Docker创建常用的容器
5.1 Nginx容器
要使用 Docker 创建一个 Nginx 容器,步骤如下:
-
拉取 Nginx 镜像
docker pull nginx:latest
-
设置Nginx 配置:可以将本地的 Nginx 配置文件挂载到容器中
docker run --name my-nginx -p 8080:80 -v /path/to/nginx/conf:/etc/nginx/nginx.conf -d nginx
-v
选项将宿主机的 Nginx 配置文件目录挂载到容器的/etc/nginx
目录下。 -
运行 Nginx 容器:可以指定一些选项,比如将容器的端口映射到宿主机的端口
docker run --name my-nginx -p 8080:80 -d nginx
--name
指定了容器的名称,-p
将宿主机的 8080 端口映射到容器的 80 端口(Nginx 默认端口),-d
表示在后台运行容器 -
访问 Nginx 服务:Nginx 容器已经在后台运行了,可以通过浏览器访问
http://localhost:8080
或http://宿主机IP:8080
来查看 Nginx 的默认欢迎页面 -
停止 Nginx 容器:
docker stop my-nginx
重新启动停止的容器:
docker start my-nginx
-
查看容器日志
docker logs my-nginx
-
进入容器内部:这将打开一个 bash 终端,可以在这个终端内执行命令
docker exec -it my-nginx bash
5.2 MySQL容器
要使用 Docker 创建一个 MySQL 容器,步骤如下:
-
拉取 MySQL 镜像
docker pull mysql:latest
-
数据持久化:默认情况下,MySQL 容器中的数据不会持久化存储。如果想要持久化存储数据,可以使用 Docker 的卷(Volume)功能或者挂载宿主机的目录到容器中
docker run --name my-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql -v /mysql/conf:/etc/mysql/conf.d -d mysql
-v
选项将宿主机的目录挂载到容器的/var/lib/mysql
目录下,这是 MySQL 存储数据的目录 -
运行 MySQL 容器:可以指定一些选项,比如将容器的端口映射到宿主机的端口,以及设置 MySQL 的根密码。
docker run --name my-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
--name
指定了容器的名称,-p
将宿主机的 3306 端口映射到容器的 3306 端口(MySQL 默认端口),-e
设置了 MySQL 根用户root
的密码,-d
表示在后台运行容器 -
访问 MySQL服务:MySQL 容器已经在后台运行了,可以使用 MySQL 客户端或者其他工具连接到
localhost:3306
或宿主机IP:3306
来访问 MySQL 服务。 -
停止 MySQL 容器:
docker stop my-mysql
重新启动停止的容器:
docker start my-mysql
-
查看容器日志
docker logs my-mysql
-
进入容器内部:这将打开一个 bash 终端,你可以在这个终端内执行命令,例如使用
mysql
命令行工具,修改配置文件vim /etc/mysql/my.cnf
docker exec -it my-mysql bash