docker初识
一、认识 docker
1.docker 诞生的意义
-
Docker 是基于 Go 语言实现的云开源项目,诞生于 2013 年初,最初发起者是 dotCloud 公司;
-
Docker 的主要目标是“Build,Ship and Run Any App,Anywhere”,即通过对组件的封装(packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个 Web 应用,也可以是一套数据库服务,甚至是一个操作系统或编译器
-
Docker 引擎的基础是 Linux 容器(Linux Containers,LXC)技术,LXC 是一种操作系统级虚拟化技术,允许在 Linux 主机上创建和管理多个独立的容器。每个容器都是一个隔离的环境,可以运行自己的操作系统和应用程序,就像独立的虚拟机一样
2.使用 docker 的好处
Docker 在开发和运维中的优势
- 更快速的交付和部署
- 更高效的资源利用。 Docker 容器的运行无需额外的虚拟化管理程序支持,它是内核级的虚拟化,可以实现刚搞性能,同时对资源的额外需求很低。
- 更轻松的迁移和扩展。Docker 容器几乎可以在任意的平台上运行,包括物理机、公有云、私有云、个人电脑,服务器等。
- 更简单的更新管理
Docker 与虚拟机比较
- Docker 容器很快,启动和停止可以在秒级实现。
- Docker 容器对系统资源需求很少,一台主机上可以同时运行数千个 Docker 容器
- Docker 通过类似 Git 的操作来方便用户获取、分发和更新应用镜像,指令简明、学习成本低
- Docker 通过 Dockerfile 配置文件来支持灵活的自动化创建和部署机制,提高工作效率
3.docker的核心组件
Docker Engine:Docker引擎是Docker平台的核心组件,它是一个轻量级的容器运行时环境。它负责创建、运行和管理Docker容器,并提供了用于构建和管理容器的API
镜像(Image) : Docker将 应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起, 称为镜像
容器(Container) : 镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见
4.DockerHub
DockerHub: DockerHub是一个Docker镜像的托管 平台。这样的平台称为Docker Registry;
国内也有类似于DockerHub 的公开服务,比如阿里云镜像库等
5.docker架构
服务端(server): Docker守护进程,负责处理Docker指令,管理镜像、容器等
客户端(client): 通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
6.docker基本操作
7.数据卷
容器与数据耦合的问题
- 不便于修改,当我们需要修改nginx的html时,需要进入到容器里去修改文件,很不方便
- 数据不可复用,在容器内的修改对外是不可见的,所有修改对新创建的容器是无法复用的
- 升级维护困难,数据在容器内,如果要删除或重新创建容器时,数据也会跟着被删除
数据卷则解决了这样的问题,数据卷是一种用于持久化存储容器数据的特性;它们允许将主机机器上的目录或文件系统挂载到容器中,以便容器可以持久化地访问和修改这些数据
常用命令
- docker volume create 创建一个volume
- docker volume ls 列出所有的volume
- docker volume inspect 显示一个或多个volume的信息
- docker volume rm 删除一个或多个指定的volume
- docker volume prune 删除未使用的volume
挂载数据卷
- 我们在创建容器时,可以通过-v参数来挂载一个数据卷到某个容器目录
docker run --name ngx -v nginx-html:/usr/share/nginx/html -p 80:80 -d nginx
docker run -d \
-p 80:80 \
--name ngx \
-v /home/docker/nginx/www:/usr/share/nginx/html \
-v /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/docker/nginx/logs:/var/log/nginx \
nginx
8.Dockerfile
在说dockerfile之前,需要简单介绍一下镜像的结构;
镜像是分层结构,每一层称为一个Layer
- Baselmage层:包含基本的系统函数库、环境变量、文件系统富
- Entrypoint: 入口,是镜像中应用启动的命令
- 其它:在Baselmage基础上添加依赖、安装程序、完成整个应用的安装和配置
而Dockerfile是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层镜像Layer
注意:Dockerfile的第一行必须是FROM,从一个基础镜像来构建,基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像;
二、docker 实操
1.下载安装 docker
CentOS系统安装Docker:
Docker 要求 CentOS 系统的内核版本高于 3.10,可通过命令 uname -r 查看
安装 docker:yum install docker-ce
启动 docker:service docker start
启动系统自动启动 docker:sudo systemctl enable docker
查看 docker 状态:systemctl status docker
查看 docker 的镜像:docker images
Ubuntu系统安装Docker:
- apt 上注册 Docker 的 GPG 密钥圈
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
- 把 Docker 包的源代码添加到你的系统中
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
docker-ce
: Docker 引擎守护程序。docker-ce-cli
: 你将与之互动的 Docker CLI。containerd.io
: 被称为 containerd的容器运行时间,用于启动和运行你的容器。
sudo apt install docker-ce docker-ce-cli containerd.io
- 验证
sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
注意:这里下载GPG密钥是为了验证下载的软件包的完整性和真实性。通过使用GPG密钥,可以保证所使用的软件包是由Docker官方签名并提供的,以避免安装被篡改或来自不可靠源的软件包
2.配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://6zukgtit.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3.使用 docker
安装 nginx:docker pull nginx
新建并编写 Dockerfile:vim Dockerfile
编写 Dockerfile 命令如下:
#声明基础镜像来源
FROM nginx
#使用当前index作为nginx首页
COPY index.html /usr/share/nginx/html/
构建新镜像:
命令格式为docker build -t [镜像名称]:[镜像版本] .,命令末尾的.表示Dockerfile文件的路径,不能忽略。以基于构建新镜像image001:v1为例,则命令为:
docker build -t image001:v1 .
启动镜像(创建新的容器):
执行以下命令,将Nginx的80端口映射至服务器的8080端口,以启动镜像并实现通过公网访问。
命令格式为docker run --name [容器名称] -p 8080:80 -d [镜像名称]:[镜像版本],示例命令:
docker run --name nginx-test -p 8080:80 -d image001:v1
启动镜像后通过 docker ps 可以查看到启动的容器,加上-a 可以看到关闭状态下的容器;
关闭容器:docker stop my-running-container
删除容器:docker rm my-stopped-container
删除所有已退出状态的容器:docker container prune
4.把文件夹发到 nginx 上访问
运行带有网站文件夹挂载的 Nginx 容器。确保使用 -v 或 --volume 选项将本地网站文件夹映射到容器内的 /usr/share/nginx/html 文件夹。这是 Nginx 默认服务静态文件的文件夹。
命令如下:
docker run -d --name nginx-text -p 8080:80 -v /root/mywebsite/code:/usr/share/nginx/html nginx
-d: 以守护态(后台)模式运行容器
--name my-nginx-container: 为容器设置一个名字
-p 8080:80: 将宿主机(你的电脑)的 8080 端口映射到容器内的 80 端口。这允许您通过访问宿主机的 80 端口来访问 Nginx 服务器
-v /root/mywebsite/code:/usr/share/nginx/html:将本地的 code 文件夹映射到容器内的 /usr/share/nginx/html 文件夹
三、认识DockerCompose
1.Docker Compose 诞生的意义
Docker Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器
我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。.Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器,Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
2.Docker Compose使用步骤
1.编写Dockerfile定义各个微服务应用并构建出对应的镜像文件dockerfile的使用
2.使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
3.最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线
3.Docker Compose常用命令
启动和停止应用程序:
-
docker-compose up:在当前目录中查找 docker-compose.yml 文件,并启动应用程序中的所有服务。
-
docker-compose up -d:以守护进程模式启动应用程序中的所有服务。
-
docker-compose down:停止并移除应用程序中的所有服务以及相关网络和卷。
构建和重建服务:
-
docker-compose build:构建由 Compose 文件定义的所有服务的镜像。
-
docker-compose build service_name:构建指定服务的镜像。
-
docker-compose up --build:在启动服务之前先构建镜像。
查看服务日志:
-
docker-compose logs:查看应用程序中所有服务的日志。
-
docker-compose logs service_name:查看指定服务的日志。
-
docker-compose logs -f:以实时滚动的方式查看应用程序中所有服务的日志。
管理服务:
-
docker-compose ps:列出应用程序中所有服务的状态。
-
docker-compose pause service_name:暂停指定服务。
-
docker-compose unpause service_name:取消暂停指定服务。
其他常用命令:
-
docker-compose exec service_name command:在指定服务的容器中执行命令。
-
docker-compose down -v:停止并移除应用程序中的所有服务、网络和卷。
-
docker-compose config:验证和查看 Compose 文件的配置
四、docker compose 实操
1.下载及安装
a.快捷安装
- ubuntu安装:
apt install docker-compose-plugin
- centos安装:
yum install docker-compose-plugin
b.二进制文件安装
- 下载二进制文件:
mkdir -p /usr/local/lib/docker/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
- 修改二进制文件权限:
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
- 查看版本:
docker-compose --version
- 卸载:
rm /usr/local/lib/docker/cli-plugins/docker-compose
注意:V2版本docker compose是以插件的方式作为docker的一部分的,安装了V2版本的docker compose之后,compose命令被集成到docker平台,作为docker CLI的一部分。之后使用compose命令就不是再用docker-compose了,而是docker compose,中间用空格隔开。当然,如果已经习惯用docker-compose命令执行的话,也可通过创建软链接来继续使用该命令
sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose
2.编排文件(docker-compose.yml)常用字段
a. version
version 字段指定了 Docker Compose 编排文件的版本
b. services
services 字段指定了在 Docker Compose 编排中要运行的服务。每个服务都有一个名称,并指定要使用的镜像和容器的配置选项
c. build 和 image
build 字段允许在 Docker Compose 编排中指定 Dockerfile 的位置,从而可以使用 Docker Compose 构建镜像。image 字段指定要使用的 Docker 镜像;例如:
services:
mysql: #服务名
image: mysql:5.5 #mysql镜像
user: #服务名
build: ./user #这里为用户微服务文件夹,里面存放的是该服务代码jar包和Dockerfile文件
d. volumes 和 environment
volumes 字段指定了要使用的数据卷。environment 字段指定了要设置的环境变量。例如:
services:
mysql: #服务名
image: mysql:5.5 #mysql镜像
environment:
MYSQL_ROOT_PASSWORD: 000000 #设置数据库密码
volumes:
- "$PWD/mysql/data:/var/lib/mysql" #数据卷挂载
e. ports 和 expose
ports 字段指定了要宿主机映射到容器的端口(宿主机端口:容器端口)。expose 字段是用于在 Docker 容器内部暴露端口的选项,可以让其他容器连接到这些端口,但不会将它们映射到 Docker 主机上。expose 与 ports 不同的是,expose 字段仅仅是将容器内部的端口暴露给其他容器使用,而不是直接映射到宿主机上的端口;例如:
services:
gateway: #服务名
build: ./gateway #这里为网关文件夹,里面存放的是该服务代码jar包和Dockerfile文件
ports:
-"7000:7000"
nginx:
image: nginx
expose:
-"8080"
3.使用docker compose
编写编排文件:
#创建docker-compose文件夹
mkdir docker-compose
#进入docker-compose文件夹
cd docker-compose
#创建并编辑docker-compose.yml文件
vim docker-compose.yml
#编辑yml文件如下
services:
nginx-test:
image: image001:v1
ports:
- 8080:80
启动应用程序
#进入到docker-compose文件夹里执行
docker compose up
通过上面简单的配置即可编排管理前面跑起来的nginx-test服务
作者:卢一
出处:http://www.cnblogs.com/luyi001/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。