Docker学习笔记
一. docker的安装
Docker安装步骤的官网地址:https://docs.docker.com/install/linux/docker-ce/ubuntu/
1.1配置仓库
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
1.2 开始安装
yum install docker-ce docker-ce-cli containerd.io
3.3 验证docker是否安装成功
docker -v #查看docker的版本信息
二. docker镜像与容器
2.1 镜像仓库的配置
Docker安装之后,通过命令docker pull 拉取镜像时,默认访问docker hub上的镜像,在国内网络环境下,下载时间较久,所以要配置国内镜像仓库。
第一步:新建或编辑daemon.json
vi /etc/docker/daemon.json
第二步:daemon.json中编辑如下
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
第三步:重启docker
systemctl restart docker.service
第四步:执行docker info查看Registry Mirrors是否修改成功
docker info
国内的加速地址如下:
1.网易
http://hub-mirror.c.163.com
2.Docker中国区官方镜像
https://registry.docker-cn.com
3.中国科技大学
https://docker.mirrors.ustc.edu.cn
4.阿里云容器 服务
https://cr.console.aliyun.com/
首页点击“创建我的容器镜像” 得到一个专属的镜像加速地址,类似于“https://1234abcd.mirror.aliyunc
2.2 镜像与容器
镜像,我们从字面意思上看,镜子里成像,我们人站在镜子面前,在镜子中会呈现一个完整的我们(包括我们的着装、表情、发型等等)。那么在软件领域的镜像是指对数据按照一定的格式的一个完整的拷贝;
容器是镜像运行时的实体,比如说镜像是个类,当没有被加载的时候,它是存放在我们的硬盘上的,而容器是对象,对象只有在程序运行的时候才会被创建,并且一个类可以创建N多个对象,对应到我们的镜像与容器,一个镜像可以用于创建多个容器,每个容器运行在各自的namespace中间。
2.3 关于镜像与容器的常见命令
docker pull "镜像名:版本" #拉取镜像
docker images #查看docker中现有镜像
docker ps #查看还在运行的容器
docker ps -a #查看所有容器
docker rmi "镜像id或者名字" #删除某一个镜像
docker rm "容器的id或者名字" #删除某一个容器
docker rm $(docker ps -aq) #删除所有容器
docker run -it "镜像名:版本号" /bin/bash #启动容器并且与终端交互,并且通过/bin/bash来解释命令
docker exec -it "容器id" /bin/bash #进入此容器
exit #通过此命令能够退出容器,但是容器就会被销毁
ctrl + p + q #通过此快捷键能狗退出容器且不会被销毁
三. docker启动mysql
systemctl start firewalld #开启防火墙
systemctl stop firewalld #关闭防火墙
systemctl status firewalld #查看防火墙状态
# -e 表示配置环境变量e:environment(环境)
docker run -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.27
# 经过上一步能够通过进入容器访问
docker exec -it "容器id" /bin/bash
mysql -uroot -p
# -p 表示指定端口 如下指令表示宿主机的端口号3307映射到容器的3306端口号
docker run -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 mysql:8.0.27
#-d 表示日志输出的动作在后台运行
docker run -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -d mysql:8.0.27
#--name 表示指定容器的名字
四. 数据卷(volume)
4.1 什么是数据卷
数据卷就是容器内部的数据目录直接映射到宿主机上的目录上,无论在宿主机还是容器内对数据的修改在另外一方都是可见的。
4.2 数据卷的使用
v /my-datas:/datas 绑定将容器中的目录挂载到宿主机的目录(前面为宿主机目录 后面为容器目录)
4.3 mysql数据卷的配置
# 1. 在宿主机上创建目录
mkdir -p /docker-mysql/config/
# 2. 进入该目录创建config-file.cnf文件
touch config-file.cnf
# 3. 编辑该文件中的内容
vim config-file.cnf
[mysqld]
character-set-server=utf8
datadir=/mysql/datas #容器中数据存放的位置
# 4. 通过数据卷实现双向绑定
docker run -p 3307:3306 -v /docker-mysql/config/:/etc/mysqlconf.d \
-v /docker-mysql/datas:/mysql/datas \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.27
# 第一个-v表示配置文件的间的双向绑定,第二个-v表示数据库数据文件间的双向绑定
五. Dockerfile
5.1 Dockerfile是什么
Dockerfile是docker中镜像文件的的描述文件,说的直白点就是镜像文件到底是由什么东西一步步构成的。例如我们在淘宝上买了一件商品,但是这个商品需要组装才能使用,于是卖家就给了你一张图纸,你就按照图纸一步一步的组装起来,然后就成了你所需要的样子。那么Dockerfile就是这张图纸,镜像文件就是你需要的商品。Dockerfile名字可以随便命名,但是不建议你这做,还是按照规范来使用,首字母要大写。
5.2 Dockerfile、镜像、容器
Dockerfile:是镜像的构建文件,描述的镜像是一步步怎么来的。
-
镜像:是通过Dockerfile做出来的,包含操作系统基础文件和软件运行环境,它使用分层的存储方式。
-
容器:是运行起来的镜像,简单理解,Docker镜像相当于程序,容器相当于进程。
5.3 Dockerfile的基本语法及执行流程
5.3.1 Dockerfile的基本语法
-
每个保留字必须放在每一行的开头,可以大写也可以小写,但是建议大写;
-
指令按照顺序,从上往下依次执行;
-
表示注释;
-
每条执行指令都会创建一个新的镜像,并且执行提交。
5.3.2 Dockerfile的执行流程
-
docker从基础镜像中执行一个容器;
-
执行一条指令对容器进行修改;
-
执行docker commit命令,提交新的镜像;
-
在基于刚刚提交的镜像运行一个新的容器;
-
执行Dockerfile中的下一条指令,按照b、c、d依次循环下去,直到所有的指令执行完毕。
5.3.3 演示讲解
FROM centos #指定要生成的镜像的基础镜像,开头第一句话必须也只能是FROM
MAINTAINER qf@163.com #指定作者是谁
RUN apt-get install -y vim #执行 yum install -y vim 命令,安装vim
RUN apt-get install -y net-tools #执行 yum install -y net-tools, 安装net-tools工具
WORKDIR /dev/ #启动容器后,如果启动交互模式,直接进入到哪个目录
CMD ["/bin/bash"] #启动容器的时候,进入到/bin/bash这种命令行
如上代码所示,FROM、MAINTAINER、RUN、WORKDIR、CMD均为关键字,按照标准的规范需要大写;FROM centos表示基础镜像是centos,然后会启动centos这个容器,执行第二行代码又会生成新的镜像文件,然后提交,周而复始。
5.4 Dockerfile关键字
关键字 | 作用 |
---|---|
FROM | 指定基础镜像 |
MAINTAINER | 作者的信息 |
RUN | 执行什么命令 |
EXPOSE | 容器对外暴露的端口 |
WORKDIR | 进入到容器后进入到哪个目录 |
ENV | 配置环境变量 |
ADD | 将文件拷贝到镜像中并解压 |
COPY | 将文件拷贝到镜像中 |
VOLUME | 配置数据卷 |
CMD | 容器启动时候执行的命令 |
ENTRYPOINT | 容器启动时候执行的命令 |
5.5 创建镜像
docker build -t "镜像名称:版本号" . #进入有daokerfile文件的目录下,然后指令的意思是创建一个自己的镜像
六. docker-compose
在开发一个应用的时候,我们需要其他的很多东西,例如数据库,nginx,网站应用等很多的环境,而docker又推崇的是每一个容器只运行一个进程,那么我们势必得很多的容器,那么我们得通过docker build命令一个个的构建镜像,然后在通过docker run命令启动一个个容器,那么当我们修改了应用后,我们又得去重复上面的操作。而且容器与容器之间存在着很多的依赖,我们在操作的时候还得去考虑先启动哪个容器,在启动另外一个容器,这些操作和步骤都得花上大量的精力。那么docker-compose的出现就是为了解决这个问题。
docker-compose是一种容器编排技术,我们可以编写一个docker-compose.yml文件,在文件中编排好我们的服务,只用通过一个命令即可搞定所有的工作。
6.1 安装docker-compose
第一步
打开: https://github.com/docker/compose/releases
第二步
将下载好的文件重新命名为docker-compose移动到/usr/local/bin/目录下。
如果docker-compose命令无效,可以给这个文件创建一个在 /usr/bin 目录下的一个软连接,如下所示:
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
第三步
# 给二进制文件加上执行权限
chmod +x /usr/local/bin/docker-compose
第四步
# 验证docker-compose是否安装成功
docker-compose --version
6.2 docker-compose.yml的编写
# 这个版本的值是依据 docker 的版本来的,参考地址: https://docs.docker.com/compose/compose-file/
version: '3.8'
# docker-compose认为每个容器是一个服务
services:
# mysql是其中一个服务的名字, 这个名字要有意义
# docker run -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -v /compose-files/mysql/config:/etc/mysql/conf.d/ mysql:8.0.27
my-db:
# 指定镜像名称
image: mysql:8.0.27
# 指定环境变量
environment:
- MYSQL_ROOT_PASSWORD=123456
# 指定端口映射
ports:
- 3307:3306
volumes:
- /compose-files/mysql/config:/etc/mysql/conf.d/
- /compose-files/mysql/datas:/mysql/datas
server:
# 构建镜像, 需要的一些信息
build:
# 构建镜像需要Dockerfile文件,context指定构建 server 这个服务的镜像的Dockerfile的地址
context: ./server
# 指定Dockerfile文件的文件名,如果叫做Dockerfile, 这行代码其实可以不用写
#dockerfile: Dockerfile
ports:
- 8080:8080
command: ["java", "-jar", "/spring-security.jar"]
fronted-web:
image: nginx
ports:
- 80:80
volumes:
- /compose-files/froned-web:/usr/share/nginx/html
标签名称 | 作用 |
---|---|
version | 指定docker-compose文件的版本 |
services | 定义服务 |
image | 指定基础镜像 |
ports | 指定对外开放的端口 |
environment | 配置环境变量 |
network_mode | 网络模式,默认为bridge(桥接)模式 |
volumes | 指定数据卷 |
context | 要构建的镜像的上下文,说白了就是相对于docker-compose.yml文件的位置 |
dockerfile | 指定Dockerfile文件的名字,如果名字为Dockerfile的话,不用指定 |
depends_on | 指定容器所依赖的另外一个容器的服务名,但是并不会等待所依赖的容器启动才去启动这个容器 |
6.3 启动
# 如果没有构建过镜像,首先会构建镜像,然后启动容器。
docker-compose up
# 无论镜像是否存在,首先会构建镜像,然后启动容器。
docker-compose up --build
# 启动已经存在的容器。
docker-compose start [service…]