docker初体验

Posted 强强强子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker初体验相关的知识,希望对你有一定的参考价值。

docker学习笔记

docker

百度百科:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

docker 各个名词说明

  1. Containers 容器:每启动一个镜像,就得到一个容器
  2. Images 镜像:把一系列环境操作封装在一起,可以做到开箱即用。(比如:一个镜像可以把Java的运行环境全部设置好,jdk tomcat)
  3. Volumes 数据卷:容器产生的数据可以放到宿主机上,容器可以挂载数据卷

docker的基本命令

docker search 镜像名字

比如搜索nginx镜像,会返回一个搜索结果列表

PS C:\\Users\\10482> docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        16575     [OK]
bitnami/nginx                                     Bitnami nginx Docker Image                      121                  [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   39
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   17                   [OK]
rancher/nginx-ingress-controller                                                                  10
……………………

docker pull 镜像名字:TAG

TAG就是镜像的版本号,版本号可以通过dockerHub 进行搜索查看
如果不带后面的TAG,则会直接拉取最新的镜像

PS C:\\Users\\10482> docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
c229119241af: Already exists
2215908dc0a2: Pull complete
08c3cb2073f1: Pull complete
18f38162c0ce: Pull complete
10e2168f148a: Pull complete
c4ffe9532b5f: Pull complete
Digest: sha256:2275af0f20d71b293916f1958f8497f987b8d8fd8113df54635f2a5915002bf1
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

docker images

查看已经下载过的镜像

PS C:\\Users\\10482> docker images
REPOSITORY      TAG       IMAGE ID       CREATED        SIZE
nginx           latest    12766a6745ee   7 days ago     142MB

docker run -itd -p 宿主机端口:容器内端口 --name 自定义名词 镜像ID

启动镜像。
-it:指交互模式启动
-d:后台运行
-p:暴露端口
–name 为容器起一个名字
下面以启动nginx镜像为例

PS C:\\Users\\10482> docker run -itd -p 80:80 --name nginx-test 12766a6745ee
8c6455110cc871ee48959d2a61349b195cb4834bbbec6628cd258cb3223dd15f

docker ps

查看正在运行的容器

PS C:\\Users\\10482> docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                NAMES
8c6455110cc8   12766a6745ee   "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp   nginx-test

docker stop 容器id

停止正在运行的容器

PS C:\\Users\\10482> docker stop 8c6455110cc8
8c6455110cc8

docker ps -a

查看历史所有运行过的容器,无论是正在运行的还是已经停止的

PS C:\\Users\\10482> docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                      PORTS                    NAMES
8c6455110cc8   12766a6745ee   "/docker-entrypoint.…"   6 minutes ago   Exited (0) 49 seconds ago                            nginx-test

docker start 容器id docker restart 容器id

start:启动一个已经停止状态的容器
restart:重启一个容器

PS C:\\Users\\10482> docker start 8c6455110cc8
8c6455110cc8
PS C:\\Users\\10482> docker restart 8c6455110cc8
8c6455110cc8

docker logs -tf --tail n 容器id

打印容器内部的日志
n:从最后n行开始,持续堵塞打印

PS C:\\Users\\10482> docker logs -tf --tail 5 8c6455110cc8
2022-04-06T03:22:07.975798269Z 2022/04/06 03:22:07 [notice] 1#1: start worker process 27
2022-04-06T03:22:07.976000054Z 2022/04/06 03:22:07 [notice] 1#1: start worker process 28
2022-04-06T03:22:07.976148733Z 2022/04/06 03:22:07 [notice] 1#1: start worker process 29
2022-04-06T03:22:07.976349348Z 2022/04/06 03:22:07 [notice] 1#1: start worker process 30
2022-04-06T03:22:07.976492025Z 2022/04/06 03:22:07 [notice] 1#1: start worker process 31

docker top 容器ID

查看容器内的进程情况

PS C:\\Users\\10482> docker top 8c6455110cc8
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                1634                1615                0                   03:22               ?                   00:00:00            nginx: master process nginx -g daemon off;
uuidd               1684                1634                0                   03:22               ?                   00:00:00            nginx: worker process
uuidd               1685                1634                0                   03:22               ?                   00:00:00            nginx: worker process
uuidd               1686                1634                0                   03:22               ?                   00:00:00            nginx: worker process
uuidd               1687                1634                0                   03:22               ?                   00:00:00            nginx: worker process
uuidd               1688                1634                0                   03:22               ?                   00:00:00            nginx: worker process
uuidd               1689                1634                0                   03:22               ?                   00:00:00            nginx: worker process
uuidd               1690                1634                0                   03:22               ?                   00:00:00            nginx: worker process
uuidd               1691                1634                0                   03:22               ?                   00:00:00            nginx: worker process

docker inspect 容器ID

查看容器的元数据(配置信息)

PS C:\\Users\\10482> docker inspect 8c6455110cc8
[
    
        "Id": "8c6455110cc871ee48959d2a61349b195cb4834bbbec6628cd258cb3223dd15f",
        "Created": "2022-04-06T03:12:49.809186187Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": 
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 1634,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-04-06T03:22:07.965678437Z",
            "FinishedAt": "2022-04-06T03:22:06.956404893Z"
        ,
        "Image": "sha256:12766a6745eea133de9fdcd03ff720fa971fdaf21113d4bc72b417c123b15619",
       …………………………此处省略……………………

docker exec -it 容器id /bin/bash

-it 交互模式打开
进入容器,并进入终端(打开一个新的终端)

PS C:\\Users\\10482> docker exec -it 8c6455110cc8 /bin/bash
root@8c6455110cc8:/# ls
bin   dev                  docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc                   lib   media  opt  root  sbin  sys  usr
root@8c6455110cc8:/# date
Wed Apr  6 03:32:04 UTC 2022
root@8c6455110cc8:/#

docker attach 容器id

进入容器,并进入一个正在运行的终端

docker cp 容器id:容器内文件路径 宿主位置

把容器内的文件拷贝到宿主机器上

docker数据卷

当容器删除后,容器内的所有数据都会丢失(比如mysql数据库)。为了解决这一问题,docker引入了Volumes技术。把容器内的文件或者文件夹映射到宿主机器上,双向同步。

docker run -it -v 宿主机目录路径:容器内目录路径 nginx

因为docker只能挂载文件夹,我们先把上次运行的nginx-test主要配置文件拷贝出来 nginx.conf 和conf.d 文件夹

PS C:\\Users\\10482> docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                NAMES
9fb752de772a   nginx     "/docker-entrypoint.…"   22 minutes ago   Up 22 minutes   0.0.0.0:80->80/tcp   nginx-test
PS C:\\Users\\10482> docker cp 9fb752de772:/etc/nginx/nginx.conf D:\\dockerData\\nginx\\
PS C:\\Users\\10482> docker cp 9fb752de772:/etc/nginx/conf.d D:\\dockerData\\nginx\\

然后重新启动一个镜像,生成一个新的容器。并对相关文件进行挂载。

PS C:\\Users\\10482> docker run -itd --name nginx-volume1 -p 80:80 -v D:\\dockerData\\nginx\\nginx.conf:/etc/nginx/nginx.conf -v D:\\dockerData\\nginx\\wwwroot:/wwwroot -v D:\\dockerData\\nginx\\conf.d:/etc/nginx/conf.d nginx
b49ed3848116c298d13640f18777ae94409de9da3509c689617cc6d0203f350d

执行后我们可以分析一下挂载是否成功,以及挂载的配置

PS C:\\Users\\10482> docker inspect b49ed3848116
[
    
      ……………………此处省略……………………
        "Mounts": [
            
                "Type": "bind",
                "Source": "D:\\\\dockerData\\\\nginx\\\\nginx.conf",
                "Destination": "/etc/nginx/nginx.conf",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            ,
            
                "Type": "bind",
                "Source": "D:\\\\dockerData\\\\nginx\\\\wwwroot",
                "Destination": "/wwwroot",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            ,
            
                "Type": "bind",
                "Source": "D:\\\\dockerData\\\\nginx\\\\conf.d",
                "Destination": "/etc/nginx/conf.d",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            
            ……………………此处省略……………………
]

上面的Mounts部分的信息,就显示了我们之前挂载的配置。

挂载的文件和宿主机双向同步

在宿主机创建一个index.html文件,容器内也存在。

#此时容器内还没有index.html文件
PS C:\\Users\\10482> docker exec -it b49ed3848116 /bin/bash
root@b49ed3848116:/# cd /wwwroot/
root@b49ed3848116:/wwwroot# ls
root@b49ed3848116:/wwwroot#
#在宿主机wwwroot中创建一个index.html 文件
10482@DESKTOP-Q0BVVQG MINGW64 /d/dockerData/nginx
$ cd wwwroot/
10482@DESKTOP-Q0BVVQG MINGW64 /d/dockerData/nginx/wwwroot
$ ls
10482@DESKTOP-Q0BVVQG MINGW64 /d/dockerData/nginx/wwwroot
$ vim index.html
10482@DESKTOP-Q0BVVQG MINGW64 /d/dockerData/nginx/wwwroot
$ cat index.html
hello docker
#
#此时会发现,容器内index.html 也存在了
root@b49ed3848116:/wwwroot# ls
index.html
root@b49ed3848116:/wwwroot# cat index.html
hello docker
#
#容器内删除index.html 并且创建一个main.html
root@b49ed3848116:/wwwroot# touch main.html
root@b49ed3848116:/wwwroot# rm index.html
root@b49ed3848116:/wwwroot# ls
main.html
#
#查看宿主机,发现和容器内的数据一致
10482@DESKTOP-Q0BVVQG MINGW64 /d/dockerData/nginx/wwwroot
$ ls
main.html

这样就可以把数据以及配置放在宿主机上,方便灵活配置。

容器删除,挂载的文件不会删除

具名挂载&匿名挂载

-v 宿主机目录路径:容器内目录路径
如果宿主机目录路径不指定会怎么样?
-v 容器内目录路径
这样就是匿名挂载,挂载的宿主机目录就在/var/lib/docker/volumes/xxxxx,xxx就是docker随机生成的id。
如果宿主机目录路径 填写的不是一个绝对路径。那么这个路径就成为了挂载卷的名字。
eg:-v wwwroot:/data/wwwroot
那么这个挂载卷的名称就是wwwroot 这就是具名挂载,挂载的宿主机目录就是/var/lib/docker/volumes/wwwroot
通过命令 docker volume ls 可以列出所有的具名挂载和匿名挂载

#列出所有数据卷
PS C:\\Users\\10482> docker volume ls
DRIVER    VOLUME NAME
local     983a795226ff6e1238d73f70e52276ac2124b93c265a3b51bffa239cfe76c799
local     c25b2344a06b0ac0970baa19132be8375074f474daecf6b00b2c49030ff991d7
#查看数据卷的配置
PS C:\\Users\\10482> docker volume inspect 983a795226ff6e1238d73f70e52276ac2124b93c265a3b51bffa239cfe76c799
[
    
        "CreatedAt": "2022-04-04T09:12:56Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/983a795226ff6e1238d73f70e52276ac2124b93c265a3b51bffa239cfe76c799/_data",
        "Name": "983a795226ff6e1238d73f70e52276ac2124b93c265a3b51bffa239cfe76c799",
        "Options": null,
        "Scope": "local"
    
]

Dockerfile

Dockerfile 是一个用来构造镜像的脚本文件,通过它可以构造我们自己想要的镜像。
Docker常用的命令

FROM #基础镜像
MAINTAINER #镜像作者 姓名<email>
RUN #镜像构建时需要运行的命令
ADD #添加其他文件 会自动解压 比如jdk压缩包 tomcat压缩包
WORKDIR #镜像的工作目录 进入容器后的默认目录
VOLUME #挂载数据卷
EXPOSE #指定对外的端口
CMD #指定容器启动时执行的命令 只有最后一个会生效 可以被覆盖
ENIRYOINT #指定容器启动时执行的命令,可以追加命令
ONBUILD #当构建一个被继承的 Dockerfile 这个时候就会运行 ONBUILD 触发命令
COPY #类似ADD 将文件拷贝到镜像
ENV #构建时设置环境变量 

Dockerfile文件示例

#以centos镜像作为基础
FROM centos
#制作镜像的作者信息
MAINTAINER zzq<1048222543@qq.com>
#设置一个环境变量
ENV myPath /usr/local
#设置工作目录,进入镜像终端后自动在工作目录下
WORKDIR $myPath
#解决centos8 停止维护 导致yum无法执行
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
#为镜像安装一些软件
RUN yum -y install vim
RUN yum -y install net-tools
#暴露端口
EXPOSE 80
CMD echo $myPath
CMD echo "---end---"
#进入镜像后 自动打开终端
CMD /bin/bash

docker build 构建一个镜像

docker build -f Dockerfile文件路径 -t 镜像名词:镜像版本号 .

#构建一个名词为zzq-centos:1.0的镜像
PS C:\\Users\\10482\\Desktop\\dockerfile> docker build -f .\\centosDockerfile -t zzq-centos:1.0 .
[+] Building 0.1s (11/11) FINISHED
 => [internal] load build definition from centosDockerfile                                                         0.0s
 => => transferring dockerfile: 38B                                                                                0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/centos:latest                                                   0.0s
 => [1/7] FROM docker.io/library/centos                                                                            0.0s
 => CACHED [2/7] WORKDIR /usr/local                                                                                0.0s
 => CACHED [3/7] RUN cd /etc/yum.repos.d/                                                                          0.0s
 => CACHED [4/7] RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*                                 0.0s
 => CACHED [5/7] RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repo  0.0s
 => CACHED [6/7] RUN yum -y install vim                                                                            0.0s
 => CACHED [7/7] RUN yum -y install net-tools                                                                      0.0s
 => exporting to image                                                                                             0.0s
 => => exporting layers                                                                                            0.0s
 => => writing image sha256:1e0e69ce8d6387dadaba6c93f6208388e1521ca1cfbdc1b9a369fc95ee961b04                       0.0s
 => => naming to docker.io/library/zzq-centos:1.0                                                                  0.0s
#发现存在一个名词为zzq-centos 版本号为1.0的镜像
PS C:\\Users\\10482\\Desktop\\dockerfile> docker images
REPOSITORY      TAG       IMAGE ID       CREATED        SIZE
zzq-centos      1.0       1e0e69ce8d63   23 hours ago   312MB
#进入自己制作的镜像 发现进入了终端,且默认就在工作目录下
PS C:\\Users\\10482\\Desktop\\dockerfile> docker run -it zzq-centos:1.0
[root@c37cf34c935a local]# pwd
/usr/local

docker网络


如上图就是docker网络的实现,首先是存在一个docker0的虚拟网卡,然后各个容器以桥接模式访问。

docker network create

#创建一个网段192.16.0.0/16 的网络 可用ip是192.16.0.0~192.16.255.255 16代表ip的前面2位不可分配 网关是127.18.0.1 网络名称是test 网络模式是bridge(桥接)
PS C:\\Users\\10482> docker network create --driver bridge --subnet 192.16.0.0/16 --gateway 192.16.1 test
a42b08afe8c1e185d5faf861d6efcda35ef8afddfcab4e77d806a37e1dde1d2c
#查看所有网络
PS C:\\Users\\10482\\Desktop\\dockerfile> docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
a42b08afe8c1   test      bridge    local
#查看网络的具体信息
PS C:\\Users\\10482\\Desktop\\dockerfile> docker network inspect 19cdc15a9407
[
    
        "Name": "test",
        "Id": "a42b08afe8c1e185d5faf861d6efcda35ef8afddfcab4e77d806a37e1dde1d2c",
        "Created": "2022-04-06T07:37:36.75540045Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": 
            "Driver": "default",
            "Options": ,
            "Config": [
                
                    "Subnet": "192.16.0.0/16",
                    "Gateway": "192.16.0.1"
                
            ]
        ,
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": 
            "Network": ""
        ,
        "ConfigOnly": false,
        "Containers": ,
        "Options": ,
        "Labels": 
    
]

使用自定义的网络

#创建两个容器 在同一网络内
PS C:\\Users\\10482> docker run -itd -p 81:81 --name nginx1 --network test --ip 192.16.0.2 nginx
PS C:\\Users\\10482> docker run -itd -p 82:82 --name nginx2 --network test --ip 192.16.0.3 nginx

这样网络隔离后,更方便我们搭建各种集群以及集群的网络安全。

以上是关于docker初体验的主要内容,如果未能解决你的问题,请参考以下文章

docker初体验

Docker深入浅出系列 | 容器初体验

docker初体验

01-docker 初体验

docker入门2---docker的初体验

Docker深入浅出系列 | 容器初体验