Docker 教程
1. 前言
Docker
是一个开源的应用容器引擎,基于Go
语言,并遵从Apache 2.0
协议开源。Docker
可以让开发者打包应用及依赖包到一个轻量级、可移植的容器,之后发布到Linux
,实现虚拟化。- 容器是完全使用沙箱机制,相互之间不存在任何接口,并容器性能开销极低。
Docker
官网:https://www.docker.com/
Github Docker
源码:https://github.com/docker/docker-ce
2. Docker 应用场景
Web
应用的自动化打包和发布;- 自动化测试和持续集成、发布;
- 在服务型环境中部署和调整数据库或其他的后台应用;
- 从头编译或者扩展现有的
OpenShift
或Cloud Foundry
平台搭建 Paas
环境。
3. Docker 优点
3.1 快速,一致地交付应用程序
Docker
允许开发人员使用提供的应用程序或服务的本地容器在标准化环境中工作,从而简化开发的生命周期。
3.2 响应式部署和扩展
Docker
是基于容器的平台,允许高度可移植的工作负载。Docker
容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。Docker
的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3. 在同一硬件上运行更多工作负载
Docker
轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker
非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
4. Docker 架构
4.1 镜像
Docker
镜像(Image
)相当于是root
文件系统。类似于面向对象中的类。
4.2 容器
- 容器(
Container
): 类似于面向对象中的以类创建的实例。镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停。
4.3 仓库
- 仓库(
Repository
): 代码控制中心,用来保存镜像。
4.4 Docker 基本概念介绍
Docker
镜像(Image
): 适用于创建容器的模板;Docker
容器(Container
): 是独立运行的一个或一组应用,是镜像运行的实体;Docker
客户端(Client
): Docker
客户端通过命令行或者其他工具使用 Docker SDK
(https://docs.docker.com/develop/sdk/
) 与 Docker
的守护进程通信;Docker
主机(Host
): 一个物理或者虚拟的机器用于执行 Docker
守护进程和容器;Docker
仓库(Repository
): Docker
仓库用来保存镜像,可以理解为代码控制中的代码仓库;Docker Hub
(https://hub.docker.com
) 提供了庞大的镜像集合供使用;一个 Docker Registry
中可以包含多个仓库(Repository
);每个仓库可以包含多个标签(Tag
);每个标签对应一个镜像;通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。Docker Machine
: Docker Machine
是一个简化Docker
安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker
,比如VirtualBox
、 Digital Ocean
、Microsoft Azure
。
5. Docker 安装
5.1 Centos Docker 安装
- 卸载之前安装的版本(如果服务器上没有安装过,忽略这步操作)
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
- 添加
docker yum
源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
yum
安装 docker
yum install docker-ce docker-ce-cli containerd.io
- 验证
docker
是否安装成功
docker info
- 配置
docker
开机启动
systemctl enable --now docker.service
systemctl enable --now docker.socket
5.2 Centos8 部署docker(阿里云安装方式)
dnf install -y device-mapper-persistent-data lvm2
dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dnf list docker-ce
dnf install -y docker-ce --nobest
systemctl start docker
5.3 Centos7 部署docker(阿里云安装方式)
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum makecache fast
sudo yum -y install docker-ce
sudo service docker start
5.4 Ubuntu 14.04 16.04
安装 docker
sudo apt-get update
sudo apt-get -y install apy-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get -y update
sudo apt-get -y install docker-ce
6. Docker 使用
6.1 Centos8 使用docker(阿里云提供方式)
6.1.1 管理Docker 守护进程
systemctl status docker
systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl enable docker
6.1.2 镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://m1i2r0y7.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker info
6.1.2 管理镜像
docker pull [选项][Docker Registry地址[:端口号]/]仓库名[:标签]
docker pull registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5
docker tag registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5:latest aliweb:v1
docker images
docker rmi -f REPOSITORY:TAG
docker rmi -f registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5
6.1.3 管理容器
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
--name: 设置容器名称
-p: 指定端口映射,hostPost: containerPort
-P: 随机指定端口映射(一般不用这个参数)
-e: 配置信息
例:配置mysql 超级管理员密码
docker create --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root IMAGE_ID/IMAGE_NAME:TAG
docker start CONTAINER_ID/CONTAINER_NAME
docker ps -a
docker container kill CONTAINER_ID
docker rm CONTAINER_ID/CONTAINER_NAME
docker run -it e1abc**** /bin/bash
exit
docker run -d --name apache e1abc****
docker exec -it apache /bin/bash
docker ps
docker commit containerID/containerName repository:tag
docker commit 1c98ec1f51cb apache:tag_id
docker run -d -p 8080:80 apache:tag_id
7. 制作 Docker 镜像
7.1 准备 Dockerfile 内容
vi Dockerfile
"""
#声明基础镜像来源
FROM apachephp:v1
#声明镜像拥有者
MAINTAINER DTSTACK
#RUN后面接容器运行前需要执行的命令,由于Dockerfile文件不能超过127行,因此当命令较多时建议写到脚本中执行
RUN mkdir /dtstact
#开机启动命令,此处最后一个命令需要是可在前台持续执行的命令,否则容器后台运行时会因为命令执行完而退出。
ENTRYPOINT ping www.aliyun.com
"""
7.2 构建镜像
docker build -t webcentos8:v1 .
docker images
7.3 运行容器并查看
docker run -d webcentos8:v1
docker ps
docker ps -a
docker ps -a --no-trunc
docker logs CONTAINER ID/NAME
7.4 制作镜像
docker commit fb2844b6**** dtstackweb:v1
docker images
7.5 镜像推送至远程仓库
docker login --username=dtstack_plus registry.cn-shanghai.aliyuncs.com
docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/dtstack123/test:[标签]
docker push registry.cn-shanghai.aliyuncs.com/dtstack123/test:[标签]