docker
Docker
一、认识docker
- Docker是一个开源的应用容器引擎
- Docker让开发者可以打包他们的应用以及依赖包到一个轻量级可移植的容器中然后发布到任何流行的 Linux或Windows操作系统的机器上
- 容器是完全使用沙箱机制,相互之间不会有任何接口,相互隔离
二、Docker架构
Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布.client
和server可以运行在同一台集群,也可以通过跨主机实现远程通信。
Docker技术的三大核心概念,分别是:
- 镜像(Image)
- 容器(Container)
- 仓库(Repostitory)
Docker镜像(Image)
Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统
环境,里面仅安装了 Apache 或用户需要的其它应用程序
镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的
机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜
像来直接使用。镜像(Image)就是一堆只读层(read-only layer)的统一视角
Docker容器(Container)
Docker 利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。我们可以把Image和Container的关系类比于面向对象中的类和对象的关系。
- 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
- 创建Container首先要有Image,也就是说Container是通过image创建的。
Container是在原先的Image之上新加的一层,称作Container layer,这一层是可读可写的(Image是只读的)。
在面向对象的编程语言中,有类跟对象的概念。类是抽象的,对象是类的具体实现。Image跟Container可以类比面向对象中的类跟对象,Image就相当于抽象的类,Container就相当于具体实例化的对象。
Image跟Container的职责区别:Image负责APP的存储和分发,Container负责运行APP
Docker仓库(Repostitory)
仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务(Registry)混为一谈,并不严格区分。
实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。
国内的公开仓库包括 阿里云 、网易云 等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
三、安装Docker
1.更新yum包
1 |
|
2.安装yum工具包和存储驱动
1 |
|
3.安装Docker的yum源
1 |
|
4.安装Docker
1 |
|
5.查看Docker版本,验证是否安装成功
1 |
|
三、Docker常用命令
Docker进程相关
启动Docker
1 |
|
设置开机启动
1 |
|
查看Docker状态
1 |
|
Docker 启动和停止

Docker镜像相关
查看镜像
1 |
|
REPOSITORY:镜像名称
TAG:镜像标签
IMAGE ID:镜像id
CREATED:镜像的创建日期(不是获取该镜像的日期)
SIZE:镜像大小
搜索镜像
1 |
|
NAME:镜像名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
拉取镜像
- 拉取镜像就是从中央仓库中下载镜像到本地,命令:
1 |
|
拉取镜像的时候默认拉取最新的版本,如果想拉取指定版本的话,需要添加版本号信息,不指
定版本的话拉取的是latest这个版本的镜像。
拉取指定版本的时候追加版本信息(网站:https://hub.docker.com查找):docker pull centos:7
删除镜像
删除单个镜像
1
docker rmi -f 镜像ID(IMAGE ID)
删除多个镜像
1
docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部
1
docker rmi -f 'docker images -qa'
Docker容器相关
查看容器
- 查看正在运行的容器
docker ps
- 查看所有容器
docker ps -a
- 查看最后一次运行的容器
docker ps -l
- 查看停止的容器
docker ps -f status=exited
创建与启动容器
1 |
|
OPTIONS说明(常用):有些是一个减号,有些是两个减号
–name=“容器新名字”: 为容器指定一个名称;
-d: 在run后面加上参数-d,会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i-t两个参数,
创建后会自动进入容器),并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:表示容器启动后会进入其命令行,为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-p: 表示端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
前者表示宿主机端口,后者是容器内的映射端口,可以使用多个-p做多个端口映射启动交互式容器
1
2
3
4
5docker run -it --name=centos 镜像名称:标签 /bin/bash
exit 退出容器
拉取centos:docker pull centos
docker run -id centos /bin/bash 后台运行(不会直接进入容器,进入容器之后exit不会关闭容器)
docker exec -it name /bin/bash 进入容器守护式方式创建容器
1
2
3docker run -id --name=容器名称 镜像名称:标签后台运行(不会直接进入容器,进入容器之后exit不会关闭容器)
docker run -id --name=mycentos2 centos:latest
docker exec -it name /bin/bash 进入容器
/bin/bash的作用是因为docker后台必须运行一个进程,否则容器就会退出,在这里表示启动容
器后启动bash。
什么是守护式容器:
能够长期运行、没有交互式会话、适合运行应用程序和服务
- 退出当前容器
exit
停止与启动容器
- 停止容器
docker stop 容器名称(或者容器id)
docker stop mycentos2
- 启动容器
docker start 容器名称(或者容器id)
docker start mycentos2
- 重启容器
docker restart 容器名称(或者容器id)
docker restart mycentos2
- 强制停止容器
docker kill 容器名称(或者容器id)
docker kill mycentos2
- 删除容器(需先停止容器)
docker rm 容器名称(或者容器id)
docker rm mycentos2docker rm ‘docker ps -aq’ 通过查询所有容器的id删除所有容器
- 查看容器信息
docker inspect
配置阿里云镜像加速
登陆阿里云开发者平台(https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors)获取加速器地址
四、Docker容器的数据卷
概念
思考:
- Docker容器删除后,在容器中产生的数据会随之销毁
- Docker容器和外部机器不可以直接交换文件
- 容器之间数据交换
数据卷:
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷绑定后,对方修改会立即同步
- 一个容器可以挂载多个数据卷
数据卷作用:
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
配置数据卷
可以在创建容器的时候,将宿主机的目录和容器内的目录进行映射,这样就可以通过修改宿主机的某个目录的文件从而去影响容器。
创建容器添加-v参数,后边为宿主机目录:容器目录,例如:
1 |
|
数据卷容器
多容器之间数据交换:
- 多个容器挂载同一个数据卷
- 数据卷容器
配置数据卷
1.创建启动数据卷容器c3,使用-v参数设置数据卷
1 |
|
2.创建启动容器c1,c2,使用–volumes-from参数设置数据卷
1 |
|
Docker 应用部署
MySQL 部署

- Docker hub上查找mysql镜像
docker search mysql
- 从Docker Hub上(阿里云加速器)拉取mysql镜像到本地,标签为5.6
docker pull mysql:5.6
- 创建容器,设置端口映射、目录映射
1 |
|
docker run -id \
–name=c_mysql \
-p 3307:3306 \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456
mysql:5.6
-p 代表端口映射,格式为宿主机映射端口:容器运行端口
-e 代表添加环境变量,MYSQL_ROOT_PASSWORD是root用户的登录密码
1 |
|
使用mysql客户端navicat连接
注意这里端口已被映射为3307(一般我们映射3306)
tomcat 部署
- Docker hub上查找tomcat镜像
docker search tomcat
- 从Docker Hub上(阿里云加速器)拉取tomcat镜像
docker pull tomcat
- 创建容器,设置端口映射、目录映射
1 |
|
docker run -id \
–name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
Nginx 部署
- Docker hub上查找Nginx镜像
docker search nginx
- 从Docker Hub上(阿里云加速器)拉取Nginxl镜像到本地
docker pull nginx
- 创建容器,设置端口映射、目录映射
1 |
|
docker run -id \
–name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/sharer/nginx/html \
nginx
1 |
|
Redis 部署
- Docker hub上查找redis镜像
docker search redis
- 从Docker Hub上(阿里云加速器)拉取redis镜像
docker pull redis:5.0
- 创建容器,设置端口映射
docker run -id \
–name=c_redis \
-p 6379:6379\
redis:5.0
- 使用redis-cli连接
docker exec -it c_redis redis-cli
- 打开redis客户端连接redis服务器
Dockerfile
Dockerfile概念
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像
对于开发人员:可以为开发团队提供一个完全一致的开发环境
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作
对于运维人员:在部署时,可以实现应用的无缝移植
Docker镜像原理

Docker镜像制作
1.容器转为镜像
1 |
|
2.Dockerfile
DockerFile 常用命令
FROM
指明构建的新镜像是来自于哪个基础镜像,例如:
FROM centos: latest
MAINTAINER
指明镜像维护者及其联系方式(一般是邮箱地址),例如:
MAINTAINER Rui Cheng chengrui.sk@gmail.com
不过,MAINTAINER并不推荐使用,更推荐使用LABEL来指定镜像作者,例如:
LABEL maintainer=“Rui Cheng”
ADD
拷贝文件或目录到镜像中,PS:如果是URL或压缩包,会自动下载或自动解压,例如:
ADD …
ADD html.tar.gz /var/www/html
ADD https://xxx.com/html.tar.gz /var/www/html
CMD
启动容器时执行的Shell命令,例如:
CMD [“-C”, “/start.sh”]
CMD [“/usr/sbin/sshd”, “-D”]
CMD /usr/sbin/sshd -D
EXPOSE
声明容器运行的服务端口,例如:
EXPOSE 80 443
COPY
拷贝文件或目录到镜像中,用法同ADD,只是不支持自动下载和解压,例如:
COPY ./start.sh /start.sh
ENV
设置环境内环境变量,例如:
ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/local/jdk1.8.0_45
VOLUME
指定容器挂载点到宿主机自动生成的目录或其他容器,例如:
VOLUME [“/var/lib/mysql”]
PS:一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。
WORKDIR
为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录,例如:
WORKDIR /data
使用脚本创建镜像
- 准备编写DockerFile文件
vim Dockerfile
1 |
|
- 构建镜像
1 |
|
- 运行镜像创建容器
1 |
|
Docker Compose服务编排
docker-compose安装
docker-compose是docker的独立产品,因此需要安装docker之后再单独安装docker compose
1 |
|
docker-compose卸载
在 Docker 中,当我们执行 docker pull xxx 的时候 ,它实际上是从 registry.hub.docker.com这个地址去查找,这就是Docker公司为我们提供的公共仓库。
在工作中,不可能把企业项目push到公有仓库进行管理。为了更好的管理镜像,Docker不仅提供了一个中央仓库,同时允许搭建本地私有仓库。介绍registry、harbor两种私有仓库搭建。
1 |
|
Docker私有仓库
搭建私有仓库
- Docker 官方提供了一个搭建私有仓库的镜像 registry ,只需把镜像下载下来,运行容器并暴
露5000端口,就可以使用了。
docker pull registry:2
docker run -id -v /opt/registry:/var/lib/registry -p 5000:5000 –name=myregistry registry:2
Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,将主机的/opt/registry目录挂载
到该目录,即可实现将镜像保存到主机的/opt/registry目录了。
- 浏览器访问http://私有服务器ip:5000/v2/__catalog,出现json说明registry运行正常
将本地镜像上传至私有仓库
- 要通过docker tag将该镜像标志为要推送到私有仓库:
docker tag nginx:latest 私有服务器ip:5000/nginx:latest
- 通过 docker push 命令将 nginx 镜像 push到私有仓库中:
docker push 私有服务器ip:5000/nginx:latest
- 访问 http://:私有服务器ip:5000/v2/_catalog 查看私有仓库目录,可以看到刚上传的镜像了:
http://:私有服务器ip:5000/v2/_catalog
从私有仓库拉取镜像
- 下载私有仓库的镜像,使用如下命令:
docker pull 私有服务器ip:5000/镜像名:版本号
docker pull 私有服务器ip:5000/nginx:latest
Docker与虚拟机对比
相关项目实践即docker与宝塔/青龙的综合运用待后续补充
