Docker Note

Last updated on 4 days ago

Docker 学习笔记

本文以在 window 10 中部署 Docker 环境 运行 dotnet core web app 为主线 记录过程

环境部署

下载Docker

image-20210530131053540

window 开启虚拟化

image-20210530162435983

新建.net core web app

新建程序

image-20210530151814645

设置参数

image-20210530151929348

运行程序

默认运行是Docker ,这里先选择 helloworldapp 运行

image-20210530152509982
  1. 运行项目没有问题

    image-20210530152231219
  1. 需要注意此文件

    image-20210530152604550

Dockerfile

把Dockerfile 从当前文件夹放到上一级中。

image-20210530153921848

image-20210530153951697

至此,环境需要运行的程序准备完毕。

PowerShell

下一步,打开 powershell 程序。

image-20210530154105810

cd 到指定工程目录 E:\Code\testDocker\helloworldapp

image-20210530154622261

命令

docker images: 查看 当前 image

xxxxxxxxxx public List GetStudent(int id, string name){    int pageCount = 0;    using (var db = SugarDao.GetInstance())   {        //Form(“Student”,”s”)语法优化成 Form(“s”)        var sable = db.Sqlable().Form(“s”).Join(“l”, “s.sch_id”, “l.id”, JoinType.INNER);        if (!string.IsNullOrEmpty(name))       {            sable = sable.Where(“s.name=@name”);       }        if (!string.IsNullOrEmpty(name))       {            sable = sable.Where(“s.id=@id or s.id=100”);       }        if (id > 0) {            sable = sable.Where(“l.id in (select top 10 id from school)”);//where加子查询       }        //参数        var pars = new { id = id, name = name };        pageCount = sable.Count(pars);        return sable.SelectToList(“s.*”, pars);   }}csharp

docker build -t myapp:v1.0 . : 创建镜像 myapp:v1.0 , 最后 . 代表在当前文件夹中开始执行。v1.0 是Tag ,算是版本号把。

依照上图操作流程,build 操作完成之后,执行 docker images,就会看到 一个列表,中间记录了名称、版本号、image id、创建时间和大小。执行docker ps 没有内容是因为还没有运行image。

下一步执行

docker run --name=myapp -p 7778:80 -d myapp:v1.0

image-20210530161559489

出现一串字符串的时候,说明容器启动成功了,这个时候再执行docker ps,就会出现如下列表:

image-20210530161653125

此时如果访问本地端口,如下图

image-20210530161829323

Docker for Desktop

在软件:window desktop docker 中也会体现出image 和 docker(容器)

image

image-20210530161957344

docker

image-20210530162042171

与此同时,也可以通过 软件 进行 docker 程序的访问

image-20210530162219487

常用命令

创建镜像

docker build -t myapp:v1.0 . //myapp 这个是自定义的但是不能有大写

运行容器

docker run --name=myapp -p 7778:80 -d myapp:v1.0

docker run --name=[容器名称] -p [宿主机端口]:[Docer本地端口] -d [镜像名称]:[标签]

删除指定镜像

docker vmi id //image id

查看镜像

docker images //查看image list

查看容器

docker ps | docker ps -a ps:-a (全部)

保存镜像文件

docker save -o 要保存的文件名 要保存的镜像

这个命令保存没有问题,但是还原的时候会导致镜像和标签为空

推荐使用:

docker save -o myapp.tar myapp:v1.0 这种:docker save -o [镜像名称].tar [镜像名称]:[标签]

导入镜像文件

docker load --input 文件 或者 docker load < 文件名

停止容器

docker stop [容器ID] 实在不想等待就直接 docker kill [容器ID]

停止所有的容器

docker stop $(docker ps -q)

重启容器

docker restart [容器ID]

强制移除容器

docker rm -f mysql1

docker image rm -f 27600aa3d7f1

重命名镜像

docker tag [镜像id] [新镜像名称]:[新镜像标签]

查看日志

docker logs

Docker 数据持久化

如果不做数据持久化的话,容器中的数据在关闭的时候就会丢失,反之,就算容器删除对数据没有影响。

数据持久化策略之volumes

  • 多个容器这间共享数据
  • 宿主机不保证存在固定的目录结构
  • 持久化数据到远程主机或者云存储而非本地
  • 需要备份、迁移、合并数据时。停止container,将volume整体复制,用于备份、迁移、合并等。

数据持久化策略之bind mount

本质上是宿主机、container之间共享宿主机文件系统。这种持久化方法更导致container与宿主机的耦合过于紧密,所以不推荐使用。

container共享宿主机配置文件。

比如docker会将宿主机文件/etc/resov.conf文件bind mount到容器上,两者会使用相同的DNS服务器。

开发环境中宿主机与container之间共享源代码、构建构件等。比如将整个build过程container化,将宿主机上的源代码文件夹bind mount到build container中。修改代码后,运行build container的build命令,build container则将build结构写入另一个bind mount的文件夹中。

一些监控类container,通过读取宿主机固定文件中的数据实现监控等。

Mongo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 拉取镜像
docker pull mongo:4.0.22

# 启动容器,挂载本地目录
docker run -itd --name mongo -p 27017:27017 -v $PWD/mongodb:/data/db mongo:4.0.22

# 2021-06-04

# 创建目录
mkdir /data/mongodb

# 启动容器
//docker run --name mongodb -v /data/mongodb:/data/db -p 27017:27017 -d 07630
-- 20210605 D 盘挂载成功 https://www.cnblogs.com/codelove/p/10312692.html
docker run -p 27017:27017 --name myMongodb -v d:/data/mongodb:/data/db -d mongo

# 进入MongoDB
docker exec -it 95ed5df9fc2c mongo admin //95ed5 是容器ID

MongoDB Shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
1. 数据库内容

//查看所有数据库
show dbs

//删除数据库
db.dropDatebase()

2. 集合内容

//创建集合
db.createCollection()

//查看所有集合\表
show collections
show tables

//选定某一集合
use db_name

//查看集合的信息
db.stats()

//删除一个集合,但是需要先指定一个数据库,即先执行 use db_name
db.dropDatabase()

//修改集合的名称
db.collection_name.renameCollection('new_name')

3. 文档内容

//插入数据
db.collection_name.insert(document)
db.collection_name.save(document)

//查询数据多条数据
db.collection_name.find()

//查询 当前数据中 test 集合里,有没有name = zhangsan 的对象
db.test.find({name:"zhangsan"});

Docker Compose

image-20220119155234027

why docker compose

操作Docker的时候

如果只是操作单例服务的话,用docker命令操作:buildrun 等等就能满足。

但是在操作一整套服务的时候,涉及到的容器操作就会巨多,运行多个微服务实例再加多个Consul做集群,然后再加上OracleredisRabbitmq等等,就会捉襟见肘。

所以需要Docker compose帮助做容器编排。

安装

Docker for windows 自带此功能

Linux 下:

1
2
3
4
5
6
7
8
#(官网安装地址,较慢,可以执行下面国内地址)
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#1.国内加速安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#2.Apply executable permissions to the binary
sudo chmod +x /usr/local/bin/docker-compose
#3.Test the installation.
docker-compose --version

命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动项目
docker-compose up

# 启动(后台运行)
docker-compose up -d

# 停止项目
docker-compose down

# 项目日志
docker-compose logs

# 查看项目中的容器列表
docker-compose ps

应用

目标

通过docker-compose 启动 web 应用,同时使用Nginx反向代理。

DockerCompose

开始

  1. 将发布好的web应用文件放到服务器上。

服务器web应用位置

  1. 在服务器应用文件夹位置添加俩文件:docker-compose.ymlproxy.conf

    docker-compose.ymldocker-compose的默认配置文件。

    proxy.conf 是要给nginx挂载的配置文件,回头可以放别的地方。

添加配置文件

  1. docker-compose.yml

    Docker-compose 配合文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    version: '2'
    services:
    webdemo:
    container_name: webdemo.compose
    build: .
    ports:
    - "8081:80"

    reverse-proxy:
    container_name: nginxdemo
    image: nginx
    ports:
    - "8082:80"
    volumes:
    - ./proxy.conf:/etc/nginx/conf.d/default.conf

    释义:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    version: '2'
    services:
    webdemo:
    container_name: webdemo.compose # 容器名称
    build: . # build 当前文件夹
    ports:
    - "8081:80" # 端口映射

    reverse-proxy:
    container_name: nginxdemo # 容器名称
    image: nginx # 镜像名称
    ports:
    - "8082:80" # 端口映射
    volumes:
    - ./proxy.conf:/etc/nginx/conf.d/default.conf # 文件映射
  2. proxy.conf

    Nginx 配置

    1
    2
    3
    4
    5
    6
    7
    server {
    listen 80;

    location / {
    proxy_pass http://192.168.137.6:8081;
    }
    }

    释义:

    1
    2
    3
    4
    5
    6
    7
    8
    server {
    listen 80; //监听端口

    location / {
    proxy_pass http://192.168.137.6:8081; //跳转url
    }
    }

运行

启动

docker-compose up -d

1
2
3
4
root@vm02:~/webdemo# docker-compose up -d
Creating network "webdemo_default" with the default driver
Creating webdemo.compose ... done
Creating nginxdemo ... done

启动日志

docker-compose logs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
root@vm02:~/webdemo# docker-compose logs
Attaching to nginxdemo, webdemo.compose
nginxdemo | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
nginxdemo | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
nginxdemo | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
nginxdemo | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
nginxdemo | 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf differs from the packaged version
nginxdemo | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
nginxdemo | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
nginxdemo | /docker-entrypoint.sh: Configuration complete; ready for start up
nginxdemo | 2022/01/19 08:27:00 [notice] 1#1: using the "epoll" event method
nginxdemo | 2022/01/19 08:27:00 [notice] 1#1: nginx/1.21.5
nginxdemo | 2022/01/19 08:27:00 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
nginxdemo | 2022/01/19 08:27:00 [notice] 1#1: OS: Linux 5.4.0-94-generic
nginxdemo | 2022/01/19 08:27:00 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
nginxdemo | 2022/01/19 08:27:00 [notice] 1#1: start worker processes
nginxdemo | 2022/01/19 08:27:00 [notice] 1#1: start worker process 30
webdemo.compose | warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
webdemo.compose | Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
webdemo.compose | warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
webdemo.compose | No XML encryptor configured. Key {887cc5db-dcb2-4d26-886d-0f3aa1c787c9} may be persisted to storage in unencrypted form.
webdemo.compose | info: Microsoft.Hosting.Lifetime[0]
webdemo.compose | Now listening on: http://[::]:80
webdemo.compose | info: Microsoft.Hosting.Lifetime[0]
webdemo.compose | Application started. Press Ctrl+C to shut down.
webdemo.compose | info: Microsoft.Hosting.Lifetime[0]
webdemo.compose | Hosting environment: Production
webdemo.compose | info: Microsoft.Hosting.Lifetime[0]
webdemo.compose | Content root path: /app

执行日志

容器列表

docker ps

1
2
3
4
root@vm02:~/webdemo# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d4ea2075140 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8082->80/tcp, :::8082->80/tcp nginxdemo
686adcb2655a webdemo_webdemo "dotnet WebDemo.dll" About a minute ago Up About a minute 0.0.0.0:8081->80/tcp, :::8081->80/tcp webdemo.compose

容器列表

访问

运行结果

查看版本

docker-compose --version

最后

至此,已经完成了通过Docker-compose动态编排容器,实现Nginx反向代理.Net core web 应用程序

随着学习的深入,后续也会渐渐丰满本篇内容。

Docker Swarm 集群

加速

镜像加速以下 或者考虑 阿里云镜像加速

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"registry-mirrors": [
"https://1rlt72n0.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://reg-mirror.qiniu.com",
"https://dockerhub.azk8s.cn",
"https://mirror.ccs.tencentyun.com"
],
"insecure-registries": [],
"debug": true,
"experimental": false,
"features": {
"buildkit": true
},
"builder": {
"gc": {
"enabled": true,
"defaultKeepStorage": "20GB"
}
}
}

常用报错

安装Docker Desktop报错 WSL 2 installation is incomplete.

安装:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

电脑启动后,Docker 没有启动,执行如下命令

cd "C:\Program Files\Docker\Docker" DockerCli.exe -SwitchDaemon


Docker Note
http://example.com/2021/10/31/Docker-Note/
Author
Harris
Posted on
October 31, 2021
Licensed under