linux 下安装docker
配置国内镜像源
// Docker 官方提供的国内镜像源: registry.docker-cn.com
// /etc/docker/daemon.json 如果此文件不存在
touch daemon.json
cd /etc/docker
vim daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
// 修改完配置后,重启docker
systemctl restart docker
操作镜像
- 查看镜像
// IMAGE ID 镜像ID 8b6c5f52aa82 只显示了前12位字符,其实是64位的字符
docker images
- 拉取镜像
// xxx镜像名称,也可以加版本号 xxx:1.2.3
docker pull xxx
- 查看镜像
// 拉取镜像后,镜像就存放到本地了,可以使用命令查看
docker images
- 删除镜像
// xxx 镜像的名称或ID
docker rmi xxx
操作容器
// 创建容器 通过--name配置容器名称
docker create --name consul consul
// 启动容器
docker start consul
// 列出正在运行中的容器列表
docker ps
// 列出所有状态的容器列表
docker ps -a
// 停止容器
docker stop consul
// 删除容器 (正在运行的容器是不能删除的,所以先停止容器再进行删除)
docker rm consul
docker网络
// 1.docker 网络的组成 沙盒 网络 端点
// 2.docker 容器之间的网络打通是通过 --link 和expose端口暴露实现
// 3.docker 容器与宿主机之间的网络打通是根据端口映射实现
// 关于docker的网络知识 之前只是粗略了解端口映射 通过这节 了解了更多 感谢
管理和存储数据
// 沙盒文件系统跟随容器生命周期所创建和移除的,数据以及文件无法直接被持久化存储。
// 由于容器隔离,我们很难从容器外部获得或操作容器内部文件中的数据。
// Docker 容器文件系统UnionFS 支持挂载不同类型的文件系统到统一的目录结构中,所以我们只需要将宿主操作系统中,文件系统里的文件或目录挂载到容器中,便能够让容器内外共享这个文件。
挂载方式
-v 或--volume
-v <host-path>:<container-path>
host-path: 宿主机文件目录
container-path 容器内文件目录
docker run -d \
--name mysql-1 \
-p 4006:3306 \
-v /usr/local/docker/mysql/config/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
-v /usr/local/docker/mysql/data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=sunlight2021 \
mysql
-v /usr/local/docker/mysql/config/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf: 将容器中 /etc/mysql/mysql.conf.d/mysqld.cnf 配置文件挂载到宿主机的 /usr/local/docker/mysql/config/mysqld.cnf 文件上;
-v /usr/local/docker/mysql/data:/var/lib/mysql: 将容器中 /var/lib/mysql 数据目录挂载到宿主机的 /usr/local/docker/mysql/data 目录下;
Docker 还支持以只读的方式挂载,这样容器中的程序是不能修改这个目录的文件的,在-v后的命令后再加上:ro
-v <host-path>:<container-path>:ro
- 挂载临时文件目录
它主要是通过内存来存储数据。可以通过 --tmpfs 挂在临时目录到容器,由于内存的具体位置不需要我们来指定,这个选项里我们只需要传递挂载到容器内的目录即可。
docker run -d --name webapp --tmpfs /usr/local/sunlight mysql
我们的部署文件,前端打包文件或者后端微服务文件可以通过挂载的方式,这样不用每次都重新创建容器
- 使用数据卷进行挂载
我们不需要知道数据具体存储在了宿主操作系统的何处,只需要给定容器中的哪个目录会被挂载即可。
docker run -d --name webapp -v /usr/local/sunlight mysql
我们也可以通过 -v name:container-path 这种形式来命名数据卷。 name便是给数据卷起别名
数据卷可以用于在多个容器(可在多个物理机上)共享数据
将容器保存为镜像
// 先查看所有的容器
docker ps -a
// xxx container-id 或者 names
docker commit xxx
docker commit -m 'message' xxx
// 便可以看到上面提交的镜像
docker images
// 通过Images Id为镜像取名字
docker tag 4441940323ea consul-1:1.0.1
// 还可以对已有镜像创建新的命名(相当于生成了一个新的容器)
docker tag webapp:1.0 webapp:latest
镜像迁移
// 先将镜像保存位tar格式
docker save consul-1>/usr/local/aehyok/consul-1.tar
// 然后可以拷贝到其他远程服务器上
// 拷贝完毕后,导入镜像文件 == 执行完毕,镜像则导入成功
docker load < /usr/local/aehyok/consul-1.tar
// 通过命令查看生成的镜像
docker images
镜像迁移另外一种方式
// 将容器的commit和save 通过export 合并成一条指令
docker export -o /usr/local/aehyok/consul-2.tar sul
// 然后可以拷贝到其他远程服务器上
// 将镜像导入(还可以给镜像命名)
docker import /usr/local/aehyok/consul-2.tar consul-2:1.0.1
// 通过命令查看生成的镜像
docker images
DockerFile 构建镜像
// 通过 \ 合并命令
// 行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式
mkdir mynginx
cd mynginx
touch Dockerfile
// 编写Dockerfile文件
//......
// imageName 给生成的镜像取名字 以及打上tag dir便是Dockerfile所在的路径
docker build -t imageName: tagName dir
// 给镜像取admin的名字 dir为. 表示当前目录
docker build -t admin .
FROM
// 指定一个基础镜像 (可以合并两个镜像)
// 一个Dockerfile中可以存在多个FROM
// 当 FROM 第二次或者之后出现时,表示在此刻构建时,要将当前指出镜像的内容合并到此刻构建镜像的内容里。
FROM nginx:latest
FROM nginx
FROM nginx:1.22.1
RUN 用于向控制台发送命令的指令
// RUN 支持通过 \ 换行,对单行太长的指令 建议切割
COPY
// 将当前目录中的package.json 拷贝到容器 /usr/src/app 目录下
COPY package.json /usr/src/app/
// COPY 也支持通配符 https://golang.org/pkg/path/filepath/#Match
// *
COPY hom* /usr/src/app/
// ?
COPY hom?.txt /usr/src/app/
ADD
// 跟COPY类似
// ADD 能够支持使用网络端的 URL 地址作为 src 源,并且在源文件被识别为压缩包时,自动进行解压,而 COPY 没有这两个能力
ENV
// 设置环境变量
ENV DATA 8
ENV VERSION 8.0.53
// 环境变量便可以在下面使用
RUN .......$VERSION ......
ARG
// 构建命令的参数变量
ARG DATA
ARG VERSION
docker build --build-arg DATA=pro --build-arg VERSION= 1.1.1 .........
ENTRYPOINT
docker compose
ubuntu 安装docker-compose
apt install docker-compose
// 启用容器 docker-compose 命令默认会识别当前控制台所在目录内的 docker-compose.yml 文件
docker-compose up
// -d代表容器后台运行
docker-compose up -d
// 通过 -p 选项来定义项目名
docker-compose -p myapp up -d
// 指定yml配置文件
docker-compose -f ./compose/docker-compose.yml
// 日志
docker-compose logs xxx
docker-compose create xx 对应 docker create xx
docker-compose start xx 对应 docker start xx
docker-compose stop xx 对应 docker stop xx