1、概述(go语言实现)
- 特性(docker利用linux内核的几个特性来实现功能)
- 利用linux命名空间
- 为docker容器提供操作系统层面的隔离(进程号隔离,网络隔离,进程间通隔离,文件系统挂载隔离,内核及版本号隔离)
- 利用linux控制组
- 为docker容器提供硬件层面的隔离
- 控制组能控制应用程序所使用的资源
- 基于该内核,控制组帮助docker引擎将硬件资源共享个容器使用,并且加以约束和限制
- 利用linux的联合文件系统
- 利用分层思想管理镜像和容器
- 利用linux命名空间
- 容器格式
- docker engine将命名空间、控制组、联合文件系统进行组合后的一个package,就是一个容器格式,docker通过对这个package中的命名空间、控制组、联合文件系统进行管理控制实现容器的创建和生命周期管理
- docker目前使用的容器格式被称为libcontainer
2、安装
-
官方安装方式
https://docs.docker.com/engine/install/centos/
-
通用所有平台安装方式
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh –mirror Aliyun
-
启动docker
sudo systemctl enable docker
sudo systenctl start docker
3、配置镜像加速
# https://y4tay211.mirror.aliyuncs.com 可以在阿里云 容器镜像服务->镜像工具->镜像加速器 中找到自己的网址
sudo vim /etc/docker/daemon.json
{
"registry-mirrors":["https://y4tay211.mirror.aliyuncs.com"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
4、镜像
-
查看镜像
docker images 或者 docker image ls
-
拉取镜像
docker pull 镜像名称:版本号
-
运行镜像
docker run 镜像id|镜像名称:tag # 无法外部访问
docker run -it -p 宿主机端口:docker容器端口 - -name 别名 镜像id或镜像名称 命令
- -d:后台启动
- -it:
-
删除镜像
docker rmi 镜像名称|镜像id 或者 docker image rm 镜像名称|镜像id
- -f:强制删
-
批量删除镜像
docker images rm -f $(docker images -q)
-
只查看镜像id
docker images -q 或者 docker images 镜像名 -q
5、容器
-
概述
- 容器是一种轻量级、可移植、并将应用程序进行打包的技术,使用应用程序可以在几乎任何地方以相同的方式运行
- docker将镜像文件运行起来,产生的对象就是容器,容器相当于是镜像运行起来的一个实例
- 容器具备一定的生命周期,
- 可以借助docker ps 命令查看运行的容器
-
查看运行的容器
docker ps -a
-
创建容器
docker create name或者imagesid
-
-t:分配一个虚拟终端
-
-i:即使没有链接也保持STDIN打开
-
--name : 为容器起名,如果不加将会随机产生一个名称
-
-
删除容器
docker container rm 容器id
docker rm 容器名称或者容器id
- -f:强制删除
-
启动容器(启动停止的容器)
docker start 容器名称或者容器id
-
-a:将结果输出到当前进程
-
-i:
-
-
暂停容器
docker pause 容器名称或者容器id
-
恢复容器
docker unpause 容器名称或者容器id
-
停止容器
docker stop 容器名或容器id
- -t:等待多长时间停止,默认等待10秒
docker kill 容器名或容器id
-
创建并启动容器
docker run -it - -name 别名 镜像id或镜像名称 命令
-
-d:后台启动
-
-p:端口映射
-
-
连接容器(进入容器)
docker attach 容器名称或容器id
- 参数:a,i
docker exec -it 容器id 命令 # 建议使用这个
-
导出容器
docker export 容器id或名称 -o 要保存的文件名
-
将容器加载为镜像
docker commit 容器id或名称 镜像名:版本号
- -m:接修改提示信息
- -a:接作者信息
-
查看容器的日志
docker logs -f 容器名称或者容器id
-
-f:实时打印日志
-
-t:显示日期
-
-
容器与宿主间的文件拷贝
docker cp 容器id|name:容器文件目录 宿主机目录
-
查看容器内的进程
docker top 容器id|name
-
查看容器内的详细信息
docker inspect 容器id|name
-
容器保存和加载
docker save 镜像名:Tag -o 镜像名-tag.tar
#
加载镜像docker load -i 镜像名-tag.tar
6、网络
同一网桥的容器都可以使用容器的名称作为容器ip进行通信。使用容器名称必须自定义网桥,不能是默认的网桥docker0
docker中网桥类型:bridge :桥接 host:仅主机模式 none:不使用任何网络
-
创建网络
docker network create -d 类型 名称
-
定制bridge网络
docker network create --subnet 192.168.0.0/16 --ip-range 192.168.8.0/24 --gateway 192.168.8.1 custom-bridge
-
删除网络
docker rm 网络id或名称
docker network rm 网络id或名称
-
查看网络
docker network ls
-
查看网络信息
docker network inspect 网络id或名称
-
启动容器指定网路
docker run -itd --network 网络名称
-
启动后加入到网桥中
docker network connect 网络id或名称 容器name|id
-
查询数据卷映射路径
docker volume inspect 数据卷name|id docker inspect 数据卷name|id
7、磁盘挂载(数据卷)
- 数据卷挂载
docker run -dit -v 主机的绝对路径目录:容器中的绝对路径目录 镜像id或名称
- 这种方式会将容器路径的原始内容全部清空,始终以宿主机路径为主
-
使用别名的方式这只数据卷
docker run -v 别名:容器绝对路径
-
别名如果存在,docker直接使用,如果不存在自动创建,保存在
/var/lib/docker/volumes
下 -
使用别名的方式保留容器路径原始内容,前提别名路径不能存在内容
-
-
volume对象挂载数据卷
docker run -dit -v volume对象名称:容器中的路径 镜像id或名称
8、案例
-
MySQL服务
-
启动mysql服务
docker run -it -d -p 3306:3306 -v mysqlData:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root用户密码 --restart=always --name mysql 容器id|name
-
–restart=always:总是启动,docker服务重启即mysql也会重启
-
mysql容器默认存储数据路径:/var/lib/mysql
-
-
数据备份(以sql语句导出)
-
备份所有数据
docker exec mysql容器的id sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
-
备份指定库的数据
docker exec mysql容器的id sh -c 'exec mysqldump --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
-
只要结构不要数据
docker exec mysql容器的id sh -c 'exec mysqldump --no-data --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
-
-
-
redis服务
-
持久化开启redis服务
docker run -itd -p 6379:6379 -v /root/data/redisData:/data --name redis --restart=always 容器name:tag|id redis-server --appendonly yes
- 数据文件存储在容器中的/data/目录中
-
自定义配置文件启动redis
docker run -itd -p 6379:6379 -v 宿主机配置文件路径:自定义容器配置文件路径 -v /root/data/redisData:/data --name redis --restart=always 容器name:tag|id redis-server 自定义容器配置文件路径
-
9、Dockerfile
-
简介
Dockerfile就是镜像的描述文件,用来构建镜像
-
格式
每条保留字指令都必须大写,切后面都要跟至少一个参数
指令按照从上到下,顺序执行
#
表示注释每条指令都会创建一个新的镜像层,并对镜像进行提交
-
Dockerfile保留命令
保留字 作用 FROM 当前镜像是基于哪个镜像的,第一个指令必须是FROM MAINTAINER 镜像维护者的姓名和邮箱地址 RUN 构建镜像时需要运行的指令 EXPOSE 当前容器对外暴露的端口号 WORKDIR 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点 ENV 用来构建镜像过程中设置的环境变量 ADD 将宿主机目录下的文件拷贝进镜像切ADD命令会自动处理URL和解压tar COPY 类似于ADD,拷贝文件和目录到镜像中将从构建上下文目录中原路径的文件/目录复制到新的一层镜像内的目标路径位置 VOLUME 容器数据卷,用于数据保存和持久化工作 CMD 指定一个容器启动时要运行的命令,Dockerfile中可以有多个CMD指定,但只有最后一个生效,CMD会被docker run之后的参数替代 ENTRYPOINT 指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数 -
构建镜像
-
创建Dockerfile文件
-
编写内容
-
使用以下命令构建
docker build -t 镜像名称 Dockerfile文件路径 # 必须在Dockerfile目录文件中使用该命令
-
10、docker-compose
-
定义和运行多个docker容器的应用,同时可以对多个容器进行编排
-
安装
https://docs.docker.com/compose/install/compose-plugin/#installing-compose-on-linux-systems
-
格式
version: "3.0" volumes: data: # 自动创建数据卷形式,先声明 external: # 使用自定义卷名,必须选创建才能使用 false services: nginx: image: container_name: # 容器名称 ports: - "80:80" # 端口 volumes: - "path:path" # 数据卷 - "data:path" environment: # 环境 - "" networks: - nginx # 网络名称 command: "" # 要执行的命令 depends_on: # 代表这个容器必须依赖哪些容器启动之后才能启动 - mysql # 服务名称 - nginx healthcheck: # 心跳检查 test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3 start_period: 40s sysctls: # 用来修改容器中系统内部参数, 并不是必须,有些服务启动受容器内操作系统参数显示可能会无法启动必须通过修改容器参数才能启动 - ulimits: # 修改系统容器内部进程数限制 nproc: 65535 nofile: soft: 20000 hard: 40000 networks: nginx: # 网络名称 bridge: # 网络类型, 默认bridge
-
build指令
-
用来将指定dockerFile打包成对应的镜像,然后再运行该镜像
-
格式
version: "3.0" services: demo: build: context: demo # 指定上下文目录Dockerfile所在目录 dockerfile: Dockerfile # 编写的Dockerfile文件名 container_name:
-
-
注意
-
如果文件的名称是
docker-compose.yaml
,可以直接使用以下命令docker-compose up -d
- -d:后台启动
-
如果文件名称不是,使用
-f
指定文件名docker-compose up -f 文件名称 -d
-
11、docker可视化工具
docker run -itd -p 8000:8000 -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --name portainer --restart=always portainer/portainer
- 可以访问
http://宿主机ip:9000
查看可视化界面