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

访问docker hub

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


如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨小小打赏一下吧,如果囊中羞涩,不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.