Docker笔记
1、docker基本介绍
0)docker、podman-docker、docker.io、docker-ce
(1)docker:
这是一个由德克萨斯大学的奥斯汀分校维护的docker snap版。snap是一种跨多种Linux发行版的新型软件打包格式,方便更新和隔离,docker就是基于这个格式的Docker社区版的封装。然而,它可能并不包含所有的Docker特性,并且可能存在一些配置差异,例如网络配置等。
(2)podman-docker:
Podman是一种无需daemon(即守护进程)环境就可以运行的下一代Linux容器工具。它的使用感觉就像Docker,但实际上并没有运行在后台的守护进程。除此以外,它的命令行调用和docker是向后兼容的,可以很容易转换过来。
(3)docker.io:
这个是Ubuntu官方维护的docker版本,存在于Ubuntu的官方库中,使用 sudo apt install docker.io 命令可以方便简洁地获取。但是,由于它往往落后于最新版Docker,可能缺少最新的一些功能。
(4)docker-ce:
这是Docker社区版(Community Edition)。含有了Docker引擎用于创建和管理Docker镜像和容器,以及 Docker 命令行界面 (CLI) 客户端。适合在笔记本、桌面和开发团队使用,提供频繁的更新和新特性。
1)架构
Docker_Host:安装Docker的主机
Docker Daemon:运行在Docker主机上的Docker后台进程
Client:操作Docker主机的客户端(命令行、UI等)
Registry:镜像仓库、Docker Hub
Images:镜像,带环境打包好的程序,可以直接启动运行
Containers:容器,由镜像启动起来正在运行中的程序
2)安装
(1)移除以前docker相关包
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
(2)配置yum源
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(3)安装docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
#以下是在安装k8s的时候使用
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6
(4)启动
systemctl enable docker --now
(5)配置加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2、基本命令
1)镜像相关
去docker hub ,找到nginx镜像
(1)拉取镜像
下载来的镜像都在本地
语法:
镜像名:版本名(标签)
docker pull nginx #下载最新版
docker pull nginx:1.20.1
docker pull redis #下载最新
docker pull redis:6.2.4
>redis = redis:latest
(2)查看镜像
docker images #查看所有镜像
(3)删除镜像
语法:
docker rmi 镜像名:版本号/镜像id
docker rmi nginx:1.20.1
2)容器相关
语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS是一系列用于配置容器运行方式的选项,IMAGE是要运行的容器镜像,COMMAND是在容器内部执行的命令,ARG是传递给命令的参数。镜像启动运行的命令(镜像里面默认有的,一般不会写)。
option | 作用 |
---|---|
-i | 以交互模式运行容器,通常与 -t 同时使用 |
-t | 启动容器后,为容器分配一个命令行,通常与 -i 同时使用 |
-v | 目录映射,容器目录挂载到宿主机目录,格式: <host目录>:<容器目录> |
-d | 守护进程,后台运行该容器 |
-p | 指定端口映射,格式:主机(宿主)端口:容器端口,如-p port:port |
-P | 随机端口映射,容器内部端口随机映射到主机的端口(49153起始 49153到65535) |
-u | 以什么用户身份创建容器 |
–name | “nginx-lb” 容器名字,如--name=xxx:设置别名 |
-m,–memory bytes | 设置容器使用内存最大值 |
-h, --hostname strin | 指定容器的 host name |
–dns 8.8.8.8 | 指定容器 dns 服务器 |
-e username=“ritchie” | 设置环境变量 |
–restart Docker | 重启后,容器是否自动重启,如--restart=always |
–privileged | 容器内是否使用真正的 root 权限 |
(1)启动容器
- 例:启动nginx应用容器,并映射88端口,测试的访问
docker run --name=mynginx -d --restart=always -p 88:80 nginx
(2)查看正在运行的容器
docker ps
(3)查看所有(包括未运行的容器)
docker ps -a
(4)删除停止的容器
docker rm 容器id/名字
- 例:强制删除正在运行中的
docker rm -f mynginx
(5)停止容器
docker stop 容器id/名字
(6)再次启动
docker start 容器id/名字
(7)应用开机自启
动态更新容器配置。可以使用此命令来防止容器消耗Docker主机的过多资源。
docker update --restart=always 容器id/名字
3)修改容器内容-(docker exec、docker run -v)
- 例:修改默认的index.html 页面
(1)进入容器内部修改,修改容器内容
docker exec -it 容器id /bin/bash
(2)挂载数据到外部修改,修改页面只需要去宿主机的 /data/html
docker run --name=mynginx \
-d --restart=always \
-p 88:80 -v /data/html:/usr/share/nginx/html:ro \
nginx
4)提交对容器的修改成镜像-(docker commit)
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
(1)将自己修改好的镜像提交
docker commit -a "leifengyang" -m "首页变化" 341d81f7504f guignginx:v1.0
(2)镜像传输
# 将镜像保存成压缩包
docker save -o abc.tar guignginx:v1.0
# 离线安装:别的机器加载这个镜像
docker load -i abc.tar
5)推送镜像到远程仓库-(docker push)
推送镜像到docker hub
应用市场。
语法:
docker tag local-image:tagname new-repo:tagname
docker push new-repo:tagname
- 例:
# 把旧镜像的名字,改成仓库要求的新版名字
docker tag guignginx:v1.0 leifengyang/guignginx:v1.0
# 登录到docker hub
docker login
docker logout(推送完成镜像后退出)
# 推送
docker push leifengyang/guignginx:v1.0
# 别的机器下载
docker pull leifengyang/guignginx:v1.0
6)查看启动日志-(docker logs)
docker logs 容器名/id
7)进入容器交互界面-(docker exec)
docker exec -it 容器id /bin/bash
8)宿主机与容器文件复制-(docker cp)
#把容器指定位置的东西复制出来
docker cp 5eff66eec7e1:/etc/nginx/nginx.conf /data/conf/nginx.conf
#把外面的内容复制到容器里面
docker cp /data/conf/nginx.conf 5eff66eec7e1:/etc/nginx/nginx.conf
9)其他命令
# docker 经常修改nginx配置文件
docker run -d -p 80:80 \
-v /data/html:/usr/share/nginx/html:ro \
-v /data/conf/nginx.conf:/etc/nginx/nginx.conf \
--name mynginx-02 \
nginx
3、DockerFile
1)基本指令集
命令 | 释义 |
---|---|
FROM | 指定基础镜像 |
MAINTAINER | 指定维护者信息,可以没有 |
LABEL | 可以为生成的镜像添加元数据标签信息,这些信息可以用来辅助过滤出特定镜像,LABEL key1=value1 key2=value2 |
RUN | 在指令前面加上RUN,执行指令 |
ADD | 复制当前目录下文件到镜像,如果复制的压缩包,会自动解压(不能使用绝对目录) |
COPY | 复制当前目录下文件到镜像,(不会自动解压) |
WORKDIR | 设置当前工作目录 |
VOLUME | 设置卷,挂载主机目录 |
EXPOSE | 指定对外的端口 |
CMD | 指定容器启动后要干的事,不可以追加命令 |
ENTRYPOINT | 指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有其他传入值作为该命令的参数,可以追加命令 |
2)单阶段构建镜像-前端(vue)
docker pull node:16.15.0
vi /applications/Dockerfile
FROM node:16.15.0
RUN git clone https://github.com/hlions/webserver-vue.git (https://gitee.com/mirschao/webserver-vue.git)
WORKDIR webserver-vue
RUN npm install
EXPOSE 8080
CMD ["npm","run","serve"]
docker build -t webserver:v1.0 .
3)单阶段构建镜像-后端(python)
docker pull python:alpine3.15
(因为python:alpine3.15是简版的,所以在宿主机下载代码,然后再COPY到容器中)
git clone https://gitee.com/mirschao/webserver-backend.git
cd webserver-backend
vi Dockerfile
FROM python:alpine3.15
COPY . ./webserverbackend
WORKDIR webserverbackend
RUN pip install -i https://mirrors.aliyun.com/pypi/simple -r requirements.txt
EXPOSE 8000
CMD ["python","manage.py","runserver","0.0.0.0:8000"]
docker build -t webserverbackend:v1.0 .
4)多阶段构建镜像(vue+nginx)
git clone git clone https://gitee.com/mirschao/webserver-vue.git
cd webserver-vue
vi Dockerfile
FROM node:16.15.0
COPY ./ /app
WORKDIR /app
RUN npm install && npm run build
FROM nginx:1.21
RUN mkdir /app
COPY --from=0 /app/dist /app
COPY nginx.conf /etc/nginx/nginx.conf
--from=0代表从第一个镜像
或者
vi Dockerfile
FROM node:16.15.0 AS basic
COPY ./ /app
WORKDIR /app
RUN npm install && npm run build
FROM nginx:1.21
RUN mkdir /app
COPY basic:/app/dist /app
COPY nginx.conf /etc/nginx/nginx.conf
5)docker实战-一个简单的网页访问计数程序(java)
(1)accesscount.jar
①CounterController.java
@RestController
public class CounterController {
@Autowired
StringRedisTemplate redisTemplate;
@GetMapping("/hello")
public String count() {
Long increment = redisTemplate.opsForValue().increment("count-people");
return "有【" + increment + "】人访问了这个页面";
}
}
②application.properties
spring.data.redis.host=127.0.0.1
spring.data.redis.password=redis
accesscount.jar下载:accesscount.jar
(2)编辑Dockerfile文件
vi Dockerfile
FROM openjdk:18.0.2
LABEL maintainer=yx
COPY accesscount-1.0-SNAPSHOT.jar /accesscount-1.0-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","/accesscount-1.0-SNAPSHOT.jar"]
(3)编译Dockerfile
将程序accesscount-1.0-SNAPSHOT.jar和Dockerfile放在linux同一个目录下
docker build -t accesscount:v1.0 .
(4)docker启动redis并设置密码
#redis使用自定义配置文件启动
docker run -v /data/redis/redis.conf:/etc/redis/redis.conf \
-v /data/redis/data:/data \
-d \ #后台启动,使用此方式启动,则redis.conf中daemonize必须设置为no,否则会无法启动
--name myredis \ # 设置容器名称为redis,方便以后使用docker ps进行管理 ,
-p 6379:6379 \ # 映射本地6379端口到容器6379端口,前为本地端口
redis:latest \ # 从redis镜像运行容器
redis-server /etc/redis/redis.conf # 在容器内启动redis-server的命令,主要是为了加载配置
--requirepass redis
或者使用下述简单命令
docker run -d -p 6379:6379 redis redis-server --requirepass redis
(5)启动容器
docker run -d -p 8080:8080 accesscount:v1.0
(6)docker推送到仓库
docker login
docker tag accesscount:v1.0 hoaprox/accesscount:v1.0
docker push hoaprox/accesscount:v1.0
5、Docker Compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
1)Compose安装
curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
2)Compose使用
参考:
1、语雀
2、docker启动redis简单方法
3、DockerFile——ENTRYPOINT