一、简介
- 什么是Docker?
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上运行,方便做持续集成并有助于整体的发布的容器虚拟化技术。
- Docker的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
- Docker的核心概念:
1、镜像: Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统
2、容器: 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
3、仓库: 仓库可看成一个代码控制中心,用来保存镜像
二、安装配置
- 安装
安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
也可以使用国内 daocloud 一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
- 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
各大云服务厂商都有提供镜像加速服务,登录之后可以在自己获取。
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://自己的云服务的加速地址"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
三、操作命令
1、docker帮助命令
- 启动docker :
systemctl start docker
- 停止docker:
systemctl stop docker
- 重启docker:
systemctl restart docker
- 查看docker状态:
systemctl status docker
- 开机启动:
systemctl enable docker
- 查看docker概要信息:
docker info
- 查看帮助文档:
docker --help
- 查看命令帮助文档:
docker 命令 --help
2、镜像命令
列出本地所有镜像:
docker images
参数:
-a:列出本地所有镜像
-q:只显示镜像ID搜索镜像:
docker search 镜像名
下载镜像:
docker pull 镜像名:版本
不指定版本,默认下载最新版
查看容器镜像,容器,数据卷所占空间:
docker system df
删除镜像 :
docker rmi 镜像ID
- 删除单个:
docker rmi 镜像1ID
- 删除多个:
docker rmi 镜像1ID 镜像2ID
3、容器命令
创建容器:
docker run 镜像名
demo:
docker run 镜像名 -i -t --name newname
参数:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="aa": 为容器指定一个名称;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
-m :设置容器使用内存最大值;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷
查看容器:
docker ps
- 查看所有启动的容器(包括停止的容器),加参数 -a
docker ps -a
- 进入容器:`docker exec -it 容器名|ID /bin/bash` - 退出容器:容器内执行命令`exit`
停止容器运行:
doker stop 容器名
启动容器:
docker start 容器名
删除容器:
docker rm 容器名
四、数据卷
- 什么是数据卷
Docker容器删除后,在容器中产生的数据也会销毁,容器内部如何和外部机器共享数据,容器之间数据交互怎么解决?
- 配置数据卷
启动容器时,使用参数 -v 设置数据卷
docker run -v 宿主机目录(文件):容器内目录(文件)
同时挂载多个文件和目录
docker run -v 宿主机目录1(文件):容器内目录1(文件) -v 宿主机目录2(文件):容器内目录2(文件)
多个容器挂载同一个文件
docker run -it --name Cb -v /home/data:/v2/data centos docker run -it --name Cb -v /home/data:/v1/data ubuntu
- 数据卷容器的配置
1、创建数据卷容器
docker run -it --name=musen -v /volume centos
2、创建容器继承数据卷容器的挂载目录
docker run -it --name=a1 --volumes-form centos
- 数据卷管理命令
查看所有的数据卷
docker volume ls
删除指定的数据卷
docker volume rm 数据卷
查看数据卷的具体位置
[root@ecs-170297 home]# docker volume inspect jenkins_home [ { "CreatedAt": "2022-02-16T22:00:38+08:00", "Driver": "local", "Labels": null, # 数据卷数据存储的具体位置 "Mountpoint": "/var/lib/docker/volumes/jenkins_home/_data", "Name": "jenkins_home", "Options": null, "Scope": "local" } ]
五、端口映射
将宿主机的端口和容器内部端口进行映射,实现外部机器可以访问容器
-P
: 随机端口映射,容器内部端口随机映射到主机的端口
-p
: 指定端口映射,格式为:主机(宿主)端口:容器端口docker run -id -p 3307:3306 centos:7
六、DockerFile
1、什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
2、镜像制作
容器转为镜像
# 把容器打包为镜像 docker commit 容器ID 镜像名称:版本号 # 把镜像转换为压缩文件 docker save -o 压缩文件名称 镜像名称:版本号 # 将压缩文件还原为镜像 docker load -i 压缩文件名称
通过Docker File制作镜像
- 1、编写DockerFile文件
FROM centos:7 MAINTAINER musen<121292679@qq.com> RUN yum install -y vim WROKDIR /usr CMD /bin/bash
- 2、通过dockerFile构建镜像
docker build -f ./xxxDcokerFile -t musenCentos:1 .
参数说明
-f
:指定dockerFile文件-t
:指定构建出来的镜像名和版本
3、DockerFile命令
- FROM: 构建镜像基于哪个镜像
- MAINTAINER :镜像维护者姓名或邮箱地址
- RUN :构建镜像时运行的指令
- CMD :运行容器时执行的shell环境
- VOLUME : 指定容器挂载点到宿主机自动生成的目录或其他容器
- USER :为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
- WORKDIR: 为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
- HEALTHCHECH :健康检查
- ARG: 构建时指定的一些参数
- EXPOSE :声明容器的服务端口(仅仅是声明)
- ENV: 设置容器环境变量
- ADD: 拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压
- COPY:拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
- ENTRYPOINT:运行容器时执行的shell命令
七、Docker Compose
1、 简介和安装
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 安装
下载Compose
# github下载 $ sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 国内镜像下载 $sudo curl -L https://get.daocloud.io/docker/compose/releases/download/2.28.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
将可执行权限应用于二进制文件:
$ sudo chmod +x /usr/local/bin/docker-compose
验证是否安装成功
docker-compose --version
卸载
$ sudo rm /usr/local/bin/docker-compose
2、Compose 使用步骤:
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 执行 docker-compose up 命令来启动并运行整个应用程序。
3、Compose常用指令
-
version
指定本 yml 文件按照的 compose 哪个版本编写的。
-
services
多个容器服务的集合
version: "3.7" services: # 容器1 webapp: build: ./dir # 容器2 mysql: xxx: xxx # 容器3 nginx: xxx: xxx
-
build
指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
version: "3.7" services: webapp: build: ./dir
-
image
指定容器运行的镜像。以下格式都可以:
version: "3.7" services: redis: image: redis
-
volumes
将宿主机的数据卷或着文件挂载到容器里。
- 使用绝对路径进行挂载
version: "3.7" services: db: image: mariadb:latest volumes: - "/home/data:/var/mysql/data"
- 使用的数据卷标进行挂载( 简洁易于管理,但是数据实际存放的位置需要费点周折才能看到 )
version: "3.7" services: db: image: mariadb:latest volumes: - [卷标名称]:/var/lib/mysql volumes: [卷标名称]:
# 查看卷标的信息 docker volume inspect [卷标名称] #输出的信息中 Mountpoint 即为数据实际存放的位置 # 查看所有的卷标 docker volume ls
-
ports
设置宿主机和容器的映射端口
version: "3.7" services: db: image: redis:latest ports: - "6379:6379"
-
expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数:
expose: - "3000" - "8000"
-
restart
设置容器重启策略
- no:是默认的重启策略,在任何情况下都不会重启容器。
- always:容器总是重新启动。
- on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
- unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
-
container_name
指定自定义容器名称,而不是生成的默认名称。
version: "3.7" services: django-app: container_name: my-web-app
-
environment
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
environment: MYSQL_ROOT_PASSWORD: pythonvip MYSQL_DATABASE: test
-
depends_on
设置容器启动的顺序依赖关系。
version: "3.7" services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
上面的案例:,先启动 db 和 redis ,才会启动 web这个容器
-
command
覆盖容器启动的默认命令参数。
command: ["bundle", "exec", "thin", "-p", "3000"]
-
links
将指定容器连接到当前连接 ,服务之间可以使用服务名称相互访问
可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
version: '3' services: web: build: . links: # 指定服务名称:别名 - "db:database" db: image: mysql
- 这样 Web 服务就可以使用 db 或 database 作为 host地址 访问 db 服务了
欢迎来到testingpai.com!
注册 关于