Docker学习笔记

一、Docker基础

1.特点

跨平台、快速运行应用、快速构建应用、快速分享应用(镜像)。

2.工作原理

Docker主机:安装了Docker环境的机器,有个Docker Daemon(一个守护进程)会在后台一直运行。
在这里插入图片描述
docker pull redis:client输入指令,到docker host的docker host进程,然后前往应用市场下载Redis到docker host,称之为镜像
docker run redis:运行Redis,会运行相关应用,称之为容器
docker build xxx:打包自己的应用成为镜像。
docker push xxx:上传自己的镜像到应用市场。
在这里插入图片描述

  • 容器类似轻量级的VMware(有隔离作用)
  • 容易共享操作系统内核(更加轻量)
  • 容器拥有自己的文件系统、CPU、内存、进程空间
  • 容器互相隔离

3.安装

  1. 卸载旧版本
sudo apt-get remove docker \
               docker-engine \
               docker.io
  1. 安装相关依赖
sudo apt-get update
  1. 添加官方秘钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 添加Docker软件源
$ echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 更新apt
sudo apt-get update
  1. 安装docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  1. 免sudo进入docker
sudo groupadd docker
 
sudo gpasswd -a ${USER} docker
 
sudo service docker restart
 
newgrp - docker

二、Docker 命令

1.镜像操作

检索 docker search
下载 docker pull
列表 docker images
删除 docker rmi

示例

docker search nginx
docker pull nginx
docker pull nginx:latest #指定最新版

2.容器操作

运行 docker run
查看 docker ps
停止 docker stop
启动 docker start
重启 docker restart
状态 docker stats
日志 docker logs
进入 docker exec
删除 docker rm

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
[COMMAND], [ARG...]命令和参数一般不需要修改

示例

docker run --help #查看相关指令的帮助
docker run nginx #运行,若无则自动下载;会阻塞终端
docker ps #查看运行中的容器
docker ps -a #查看所有容器
docker ps -aq #查看所有容器,仅返回id
docker start 593 #启动已经停止了的容器,id无需写全,可区分即可
docker stop 命名/id #停止指定容器
docker stop -t 5 my_container #5秒后停止指定容器(默认为10s)
docker rm -f 592 #强制删除
docker rm $(docker ps -aq) #一键删除所有容器

3.run细节

-d 后台运行
--name 起名
-p 88:80 端口映射,通过docker的88端口,访问其中容器的80端口;外部访问所必需的;docker host的端口不可重复,容器的端口可以重复。
-it 交互模式

示例

docker run -d --name myproject -p 80:80 nginx #后台运行并自主起名
docker exec -it myproject/id /bin/bash #进入响应的unix容器
exit #退出容器

Linux相关

vi index.html #比vim更简陋的编辑器,但容器通常不包含
echo "<h1>Hello,Docker<h1>" > index.html #echo的覆盖功能
echo ... >> ... #echo的追加功能
cat index.html #用于连接文件并在标准输出上显示其内容

4.保存与分享镜像

提交 docker commit
保存 docker save
加载 docker load
-m 提交信息
登录 docker login
命名 docker tag
推送 docker push

docker commit [OPTIONS] CONTAINER [REPOSITOPY[:TAG]]
[REPOSITOPY[:TAG]] 镜像和标签

docker save [OPTIONS] IMAGE [IMAGE...]

docker commit -m "uodate index" myp mynginx:v1.0 #-m表示提交信息
docker save -o mynainx.tar mynginx:v1.0 #-o表示压缩包
docker load -i mynginx.tar #加载镜像
docker tag mynginx:v1.0 myname/munginx:v1.0 #重命名旧→新
docker push myname/munginx:v1.0

三、Docker 存储

1.目录挂载

容器关闭时,其内部文件也会丢失。容器外目录和内部目录映射。
-v 外部主机位置

docker run -d -p 80:80 -v /app/ngthml:/usr/share/nginx/html -name app01 nginx 
#建立映射外部:内部,若原本外部文件夹不存在,则创建;再次创建时,容器与外部目录内容保持一致。

2.卷映射

卷操作docker volume

目录挂载时,会在容器外创建空文件夹,导致其无法识别到容器内原本的文件。创建一个卷,docker会自动创建相关位置,卷起始以容器内的内容为准。
docker host将其统一放在了/var/lib/docker/volumes/<volume-name>

示例

docker run -d -p 99:80 -v ngconf:/etc/nginx --name app03 nginx #卷映射。无目录格式
docker volume ls #列表
docker volume create haha #创建卷
docker volume inspect ngconf #查看卷详细信息
docker container inspect app1 #查看容器细节

四、Docker 网络

1.自定义网络

  • 实现类似ip→域名的功能,让容器之间可以互相访问。
  • docker0默认不支持主机域名。
  • 创建自定义网络,容器名就是稳定的域名。

docker image

  • create 创建
  • inspect 检查细节
  • ls 列表
  • rm 移除
docker run -d -p 88:80 --name app1 --network mynet nginx #将创建的容器加入到mynet网络,形成域名http://app1:80
curl http://app1:80 #获取网页内容:域名访问,也可以使用ip地址

2.Redis主从集群

读写分离:一个Redis作为主机用于写,一个Redis作为从机用于读。同时使用目录挂载。

用的并未官方Redis镜像,其官方镜像还需要设置配置文件。因此使用的是bitnami/redis
在这里插入图片描述

主机设置

REDIS_REPLICATION_MODE=master #设置主机
REDIS_PASSWORD=123456 #设置密码

从机设置

REDIS_REPLICATION_MODE=slave #设置从机
REDIS_MASTER_HOST=redis01 #设置从机的master地址
REDIS_MASTER_PORT_NUMBER=6379 #告知从机master的端口
REDIS_MASTER_PASSWORD=123456 #告知从机master的密码
REDIS_PASSWORD=123456 #设置从机密码

具体操作

cd /app
chmod -R 777 rd1 #改变修改权限
#主机配置
docker run -d -p 6379:6379 \
-v /app/rd1:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=master \
-e REDIS_PASSWORD=123456 \
--network mynet --name redis01 \
bitnami/redis

#从机配置
docker run -d -p 6380:6379 \
-v /app/rd2:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=slave \ 
-e REDIS_MASTER_HOST=redis01 \
-e REDIS_MASTER_PORT_NUMBER=6379 \
-e REDIS_MASTER_PASSWORD=123456 \
-e REDIS_PASSWORD=123456 \
--network mynet --name redis01 \
bitnami/redis

五、Docker Compose

批量管理容器的工具。

1.基础

在这里插入图片描述
上线:docker compose up -d
下线:docker compose down
启动:docker compose start x1 x2 x3
停止:docker compose stop x1 x2
扩容:docker compose scale x2=3

旧方法应用实例
在这里插入图片描述
其中 --restart always 是开启自启动。

直接编写compose.yaml,之后在其他设备商可以一键启动,不用上述的麻烦配置。

2.语法

在这里插入图片描述
示例

name: myblog
services:
	 mysql:
	 	container_name: mysql
	 	image: mysql:8.0
 		ports:
 			- "3306:3306"
		environment:
	 		- MYSQL_ROOT_PASSWORD=123456 #数组写法
			- MYSQL_DATABASE=wordpress
		volumes:
 			- mysql-data:/var/lib/mysql
			- /app/myconf:/etc/mysql/conf.d
	 	restart: always
 		networks:
 			- blog
 	wordpress:
 		image: wordpress
 		ports:
 			- "8080:80"
 		environment:
	 		WORDPRESS_DB_HOST: mysql #kv写法
 			WORDPRESS_DB_USER: root
 			WORDPRESS_DB_PASSWORD: 123456
 			WORDPRESS_DB_NAME: wordpress
 		volumes:
 			- wordpress:/var/www/html
 		restart: always
 		networks:
 			- blog
 		depends_on: # 决定启动顺序,mysql先启动
 			- mysql
volumes:
	mysql-data: #卷映射,要在顶级元素中声明
	wordpress:
networks:
	blog:

启动

docker compose -f compose.yaml up -d

在这里插入图片描述

3.启动

增量更新
修改.yaml文件后,再次上线,只会修改有变化的容器。

普通移除

docker compose -f compose.yaml down

移除容器时,卷不会被移除,再次上线时数据不会丢失。

镜像&卷移除

docker compose -f compose.yaml down --rmi all -v

六、Dockerfile

1.制作镜像

在这里插入图片描述
在这里插入图片描述
示例

rz #上传待打包文件
vim Dockerfile #编写dockerfile文件

dockerfile文件内容(以Java为例):

FROM openjdk:17 #基础环境
LABEL author=niyeye #打标签
COPY app.jar /app.jar #软件包放到镜像中
EXPOSE 8080 #指定端口
ENTRYPOINT ["java","-jar","/app.jar"] #启动命令

打包:

# -t表示tag, . 表示指定目录
docker build -f Dockerfile -t myjavaapp:v1.0 .

2.镜像分层机制

每个指令都产生一个存储层,有利于减轻磁盘压力。
在这里插入图片描述
如下所示,两个应用都有自己的代码和依赖,共用同一个openjdk:17,然后再存储二者不同的部分。
在这里插入图片描述

七、Python打包实例

我自己找了个开源项目,试着将其打包(模型参数文件下载一部分即可,不需要全部下载)。
https://github.com/yining043/NeuOpt

1.准备工作

首先搭建起来一个可以运行上述程序的环境(可能需要pytorch等)。由于需要明确打包所需环境,可以安装如下包:

pip install pipreqs

然后打开程序的目录如NeuOpt-CVRP,在终端输入以下内容获取requirements.txt

pipreqs -force .

将获取到的requirements.txt放到NeuOpt-CVRP的上一级目录。根目录结构如下所示:

.
├── Dockerfile
├── NeuOpt-CVRP
└── requirements.txt

2.编写Dockerfile

在根目录打开终端,输入:

vim Dockerfile

在Dockerfile中输入以下内容:

FROM python:3.11

LABEL author="fans of Yining Ma"

WORKDIR /app

COPY NeuOpt-CVRP /app/

COPY requirements.txt /app/

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone

RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

EXPOSE 5033

CMD ["python", "run.py"]

根目录结构如下所示:

.
├── Dockerfile
├── NeuOpt-CVRP
└── requirements.txt

3.打包

输入以下命令打包(不要忘了最后的点):

docker build -f Dockerfile -t neuopt:v1.0 .

查看镜像列表:

docker images

创建容器并运行

docker run -d -p 5000:5033 neuopt:v1.0

运行后可以通过http://localhost:5000访问项目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值