Docker 简单介绍
基本概念
镜像
docker 镜像好比一个模板,可以通过这个模板来创建容器服务,是一种轻量级、可执行的软件包,包含运行应用程序时所需要的一切:代码、运行时、库、环境变量、配置文件等
所有的应用打包成一个 docker 镜像,然后跑起来即可
得到镜像的方式:
- 从远程下载
- 自己制作一个镜像 DockerFile
容器
容器是从镜像创建的可运行的实例,它可以在多个环境中部署,包括开发、测试、生产等。容器通过使用 Docker 引擎运行应用程序,并提供所需的资源来运行该应用程序。容器是可变的,可以创建、启动、停止、删除等。
仓库
存放镜像的地方,分为公有仓库和私有仓库
Docker 安装
安装需要的软件包
yy -utils提供了yy-config-manager相关功能,device-mapper-persistent-data和lvm2是设备映射器驱动程序所需要的。
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
设置 docker 下载镜像
推荐阿里云下载地址
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 软件包索引
我们在更新或配置 yum 源之后,通常都会使用 yum makecache 生成缓存,这个命令是将软件包信息提前在本地缓存一份,用来提高搜索安装软件的速度
yum makecache fast
安装 docker ce
yum install -y docker-ce
启动 docker
systemctl start docker
版本验证
docker version
设置开机启动
#查看服务是否自动启动(是:enabled | 否:disabled)
systemctl list-unit-files|grep docker.service
#设置开机启动:如不是enabled可以运行如下命令设置自启动
systemctl enable docker
#重新加载服务配置
systemctl daemon-reload
#如果希望不进行自启动,运行如下命令设置
systemctl disable docker
#重新加载服务配置
systemctl daemon-reload
卸载
systemctl stop docker
yum remove -y docker-ce
rm -rf /var/lib/docker
底层原理
run 流程
- 先到本地找 docker 镜像,如果没找到,就去 远程 Dokcer Hub 中找
- 若远程中找到,就会下载到本地进行使用
Docker 是怎么样运行的
Docker 是一个 Client-Server 结构的系统,Docker 的守护进程运行在主机上,通过 Socket 从客户端访问
DockerServer 接收到 Docker-Client 的指令,就会执行命令
Docker 为什么比 虚拟机 快
- Docker 有着更少的抽象层;
- Docker 利用的是宿主机的内核,VM 需要 Guest OS
所以,启动 Docker 时,不需要像 VM 一样启动操作系统内核,避免引导。虚拟机利用的是 Guest OS,而 Docker 利用的是宿主机的操作系统,省略了复制的过程
镜像基本命令
帮助命令
docker version # 版本信息
docker info # 系统信息 - 镜像和容器数量
docker 命令 --help # 帮助命令
镜像命令
docker images
:查看所有镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
仓库名称 仓库标签 镜像ID 创建时间 镜像大小
可选项:
-a, --all 显示所有镜像
-q, --quiet 显示镜像ID
docker search 镜像名称
:搜索镜像
docker pull 镜像名称:版本信息
:拉取镜像,版本信息一定是要在 Docker Hub 上规定的
[root@VM-8-9-centos ~]# docker pull mysql:5.7 #拉取镜像
5.7: Pulling from library/mysql
e83e8f2e82cc: Pull complete # 分层下载
0f23deb01b84: Pull complete
f5bda3b184ea: Pull complete
ed17edbc6604: Pull complete
33a94a6acfa7: Pull complete
f153bd2953e4: Pull complete
ab532edfb813: Pull complete
c76bdfe4f3d0: Pull complete
8a7ffe2f2551: Pull complete
857ada4fbbcc: Pull complete
b7c508404c3c: Pull complete
Digest: sha256:f57eef421000aaf8332a91ab0b6c96b3c83ed2a981c29e6528b21ce10197cd16
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 镜像名称/ID
:删除镜像
容器命令
我们有了镜像才能有容器,需要下载一个 Linux Centos 镜像
docker pull centos
docker run [可选参数] images
:运行容器
docker run [可选参数] images
-d: 以后台形式运行
-it: 使用交互方式运行
-p: 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-it:表示进入容器
可以使用 exit
命令退出,使用 CTRL + P +Q
不结束容器退出
docker ps
:查看当前运行的容器
docker ps [参数]
-a:显示正在运行的容器 + 历史运行过的容器
-p:只显示容器ID
docker rm 容器ID
:移除容器
docker start 容器ID
:开启容器
docker restart 容器ID
:重启容器
docker stop 容器ID
:关闭容器
docker kill 容器ID
:强制关闭容器
其他常见命令
docker logs
:查看日志
docker inspect 容器ID
:查看镜像详细信息
docker top 容器ID
:查看镜像中的进行信息
docker exec -it 容器ID bashshell
:进入正在运行的容器,并开启新的终端
docker attach 容器ID
:进入正在运行的容器,但不开启新的终端
docker exec -it f0cc733edfae /bin/bash
Docker 安装示例
安装 Nginx
docker search nginx
搜索镜像
docker pull nginx
拉取镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 dd6675b5cfea 5 days ago 569MB
nginx latest 6efc10a0510f 10 days ago 142MB
centos latest 5d0da3dc9764 19 months ago 231MB
docker run -d --name nginx01 -p 80:80 nginx
启动容器
# -d:后台运行
# -- name:给容器起名字
# -p:暴露端口 主机端口:容器端口
安装 Tomcat
docker pull tomcat:9.0
:拉取镜像
docker run -d -p 8080:8080 tomcat:9.0
:启动 tomcat 服务
docker exec -it 容器ID /bin/bash tomcat:9.0
:进入容器修改 webapps 目录下的文件
Commit 提交镜像
docker commit
:提交容器称为一个新的副本
docker commit -a="ezreal" -m="add webapps file" 容器ID 自定义镜像名称
# -a:作者
# -m: 格外信息
讲我们操作过的容器通过 commit 提交成为一个新的镜像,以后我们使用我们修改过的镜像即可,相当于虚拟机的快照
讲我们修改过的 tomcat 容器提交成为一个新的镜像:
docker commit -a="ezreal" -m="add webapps file" bdbcf3eae556 tomcat.0.01
容器数据卷
容器和宿主机之间的一个共享数据的技术,Docker 容器中产生的数据同步到 宿主机本地,而宿主机本地产生的数据也会同步到 Docker 中;
指定目录挂载
命令:
docker run -d -it - p 8080:8080 -v 主机目录 : 容器目录 镜像ID
安装 MySQL
将容器中 MySQL 的数据共享到宿主机上
docker pull mysql:5.7
:获取 MySQL 镜像
docker run -d -p 3306:3306 -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d -v/usr/local/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
:启动 MySQL 服务
-p 映射端口
-e 配置环境
-d 后台运行
-v 文件映射
具名挂载和匿名挂载
这两个其实是使用默认的挂载路径
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径: # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
具名挂载
docker pull nginx
:获取 nginx 镜像
docker run -d -p 80:80 -v nginx:/etc/nginx nginx
:运行 nginx 镜像,并使用具名挂载
docker volume list
:查看数据卷情况
docker volume inspect nginx
:查看某个数据卷具体信息
匿名挂载
docker pull nginx
:获取 nginx 镜像
docker run -d -p 80:80 -v /etc/nginx nginx
:运行 nginx 镜像,并使用匿名挂载,只写容器内路径
docker volume list
:查看数据卷情况
DockerFile
DockerFile 是用构建 docker 镜像的文件
- 编写一个
dockerfile
文件 - 使用
docker bulid
命令构建镜像 docker run
运行镜像docker push
发布镜像(Docker Hub、阿里云)- 注意:所有 dockerfile 的指令都要大写
DockerFile 指令
docker build -t 镜像名称:镜像版本 .
:构建镜像的指令,末尾的 . 表示 Dockerfile 的位置
FROM
:基础镜像,一切从这里开始构建
MAINTAINER
:镜像是谁写的:姓名 + 邮箱
RUN
:镜像构建的时候需要运行的命令
ADD
:添加内容
WORKDIR
:镜像的工作目录
VOLUME
:挂载的目录
EXPOSE
:暴露的端口
CMD
:指这个容器启动的时候需要运行的命令,只有最后一个才会生效,可被替代
ENTRYPOINT
:指这个容器启动的时候需要运行的命令,可以追加命令
ONBUILD
:当构建一个被继承的 dockerfile,这个时候就会追加 ONBUILD 指令
COPY
:类似 ADD,讲我们的文件拷贝到镜像中
ENV
:构建的时候设置环境变量
使用 dockerfile 编写增强版 centos
FROM centos:centos7 #基础镜像
MAINTAINER ezreal<956371950@qq.com> # 构建者信息
ENV MYPATH /usr/local # 环境变量
WORKDIR $MYPATH # 路径
RUN yum -y install vim # 添加构建的命令
RUN yum -y install net-tools
EXPOSE 8001 # 暴露端口
CMD echo $MYPATH
CMD echo ------build success------
CMD /bin/bash
主机系统是 centos7 而 docker 的 image 中的 centos 使用的是 centos8,一般 image 中的 centos8 中的 yum 默认使用宿主机的 yum 源,更换镜像到 centos7 后这个问题可以解决
该 dockerfile 在 centos7 的基础上增加了 vim 和 net-tools 的功能