Docker基础知识

Docker入门

Docker的概述

Docker介绍

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 LinuxWindows操作系统的机器上,也可以实现虚拟化

容器是完全使用沙箱机制,相互之间不会有任何接口,容器之间互相隔离

一个完整的Docker有以下几个部分组成:

  1. DockerClient客户端
  2. Docker Daemon守护进程(一直运行在服务器上)
  3. Docker Image镜像
  4. DockerContainer容器

Docker的历史

在2010年,美国的几个IT行业的年轻人成立一家dotCloud的小型创业公司,做一写pass(Platform as a service)的云计算服务,LXC有关的容器技术,他们将自己的技术(容器化技术)命名为Docker

在当时,dotCloud并不被人关注,所以就慢慢做不下去,于是乎,这几个年轻人就将自己的项目开源

在2013年,Docker的创始人Solomon Hykes将Docker开源到GitHub上,Docker项目一经发布,就迅速爆火,越来越多的人就发现了Docker的优点

在2014,Docker 1.0版本横空出世!

VM与Docker的区别

在这里插入图片描述

相较于VM来说,Docker并没有在源宿主机上在创建一个完整的虚拟机环境,而是安装一些必要的启动环境,极大地减少了内存消耗,减少了启动时间

其他相关知识

pass服务:https://www.ibm.com/cn-zh/cloud/learn/paas

Linux容器:https://www.redhat.com/zh/topics/containers/whats-a-linux-container


Ubuntu安装Docker

我用的是Ubuntu所以只写了Ubuntu安装Docker的方式,CentOS或者Windows安装Docker,请看官方文档

CentOS:https://docs.docker.com/engine/install/centos/

Windows:https://docs.docker.com/desktop/install/windows-install/

卸载之前docker

sudo apt-get remove docker docker-engine docker.io containerd runc

通过仓库下载Docker

建立仓库
  1. Update the apt package index and install packages to allow apt to use a repository over HTTPS:

    $ sudo apt-get update
    
    $ sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    
  2. Add Docker’s official GPG key:

    $ sudo mkdir -m 0755 -p /etc/apt/keyrings
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    
  3. Use the following command to set up the repository:

    $ echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    

下载Docker引擎

安装最新版本的docker-ce
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装指定版本
  1. 查看以往版本

    # List the available versions:
    apt-cache madison docker-ce | awk '{ print $3 }'
    5:20.10.16~3-0~ubuntu-jammy
    5:20.10.15~3-0~ubuntu-jammy
    5:20.10.14~3-0~ubuntu-jammy
    5:20.10.13~3-0~ubuntu-jammy
    
  2. 选择下载指定版本docker

    VERSION_STRING=5:20.10.13~3-0~ubuntu-jammy
    sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
    

检查下载情况

  1. 使用sudo docker version查看docker版本
  2. 使用sudo docker run hello-world查看docker是否能运行

出现了确定信息后,说明docker下载成功

Ubuntu卸载Docker引擎

  1. Uninstall the Docker Engine, CLI, containerd, and Docker Compose packages:

    $ sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
    
  2. Images, containers, volumes, or custom configuration files on your host aren’t automatically removed. To delete all images, containers, and volumes:

    $ sudo rm -rf /var/lib/docker
    $ sudo rm -rf /var/lib/containerd
    

You must delete any edited configuration files manually.


Docker下载源设置

将国外的镜像源修改成国内的镜像源

  1. 创建/etc/docker/daemon.json文件

    sudo vim /etc/docker/daemon.json
    
  2. 添加阿里云镜像源地址

    {
    "registry-mirrors":[
    "https://kfwkfulq.mirror.aliyuncs.com",
    "https://2lqq34jg.mirror.aliyuncs.com",
    "https://pee6w651.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com"
    ],
    "dns":["8.8.8.8","8.8.4.4"]
    }
    
  3. 重启Docker服务

    sudo service docker restart
    
  4. 查看Docker镜像源地址

    sudo docker info|grep Mirrors -A 1
    # 查看详情信息
    docker info
    

Docker原理

hello-world加载原理

第一步:我们通过客户端向Docker Server发送了一条docker run的命令。
第二步:Docker Server会查看本地是否有对应的镜像,如果有的话直接进入第四步,否则进入第三步。
第三步:Docker 会去镜像仓库中下载对应的image到本地。
第四步:拥有了镜像,Docker将镜像运转起来,成为容器,这其中最重要的会为运行起来的容器分配相应的运行需要的资源,如网络,存储,CPU,内存等

Docker三要素

在这里插入图片描述

镜像

镜像是Docker的核心,是基于联合文件系统的一种层式结构。由一系列指令构建,是一种轻量级、可执行的独立软件包,用于打包软件运行环境和基于运行环境开发的软件(代码、运行时、库、环境变量和配置文件)

**联合文件系统(UnionFS)**是一种分层、轻量级、高性能的文件系统。它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一虚拟文件系统下。Union文件系统是Docker镜像的基础

在这里插入图片描述

Docker镜像(image)就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器

镜像分层的优势就是实现资源共享

  • 通过引入分层技术,可以增加镜像复用度,减少磁盘占用
  • 同时可以实现差分上传下载,加快镜像pull、push性能

例如:当你需要下载一个镜像时,该镜像包含了你原来的一经下载过的镜像,那么已经下载过的镜像将不在下载,而是复用

容器
  • Docker利用容器(container)独立运行的一个或者一组应用。

  • 容器是利用镜像创建的运行实例(相对于Java中的类和对象的概念)

  • 容器可以被启动、开始、停止、删除

  • 每个容器都是互相隔离的,保证安全的平台

  • 可以把容器看做是一个简易版的Linux环境 (包括root用户名权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序

  • 容器的定义和镜像几乎是一模一样的,也是一堆层的统一视角, 唯一区别的是容器的最上面那一层是可读可写的

  • 容器是镜像启动或执行阶段。Docker中的每个容器都包含了一个软件镜像,该镜像可以被创建、启动、关闭、重启和销毁

仓库

仓库(repository)是集中存放镜像文件的场所 。最大的公开仓库是docker hub( https://hub.docker.com/), 存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等

Docker Hub中有两种类型的仓库:用户仓库(user repository)和顶层仓库(top-level repository)。用户仓库的镜像都是由Docker用户创建的,而顶层仓库则是由Docker内部的人来管理的

用户仓库的命名由用户名和仓库名两部分组成,如:jamtur01/puppet。用户名:jamtur01,仓库名:puppet

顶层仓库只包含仓库名部分,如ubuntu仓库。顶层仓库由Docker公司和由选定的能提供优质基础镜像的厂商(如Fedora团队提供了fedora镜像)管理,用户可以基于这些基础镜像构建自己的镜像

仓库(repository)和仓库注册服务器(registry)是有区别的。仓库注册服务器上往往放着很多个仓库,每个仓库中又包含了很多个镜像,每个镜像有不同的标签(tag)。使用示例:仓库名:TAG号


Docker常用命令

帮助命令

docker version			  # 查看docker版本
docker info				  # 查看详细信息
docker 命令 help			 # 查看docker命令

Docker命令地址:https://docs.docker.com/reference/

镜像命令

  • docker images: 查看本地上所有的镜像信息

    halley@halley-HBL-WX9:~$ docker images
    REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
    centos       latest    5d0da3dc9764   17 months ago   231MB
    
    docker images
    -a, --all             Show all images (default hides intermediate images) # 显示所有镜像
          --digests         Show digests
    -f, --filter 	filter   Filter output based on conditions provided
          --format 	string   Format output using a custom template:
    -q, --quiet           Only show image IDs	# 只显示镜像ID
    
  • docker search: 搜索镜像

    halley@halley-HBL-WX9:~$ sudo docker search mysql
    NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    -f, --filter 	filter   Filter output based on conditions provided	# --filter=STARTS=3000 starts大于3000
          --format 	string   Pretty-print search using a Go template
          --limit 	int       Max number of search results
          --no-trunc        Don't truncate output
    
    
  • docker pull: 下载镜像

    docker pull [OPTIONS] NAME[:TAG|@DIGEST]

  • docker rmi: 删除镜像

    docker rmi 镜像ID 						# 删除镜像
    docker rmi 镜像ID,镜像ID,镜像ID,镜像ID 	  # 删除镜像
    docker rmi -f $(docker images ps -aq)	  # 删除所有镜像
    

容器命令

  • 运行容器docker run

    docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

    # 新建并进入容器"
    docker run --name="Name" -it 镜像名 /bin/bash
    
    # 参数说明
    --name="Name"	容器名字
    -d				后台方式幸运
    -it				使用交互方式运行,进入容器查看内容
    -p				制定容器端口		-p 8080:8080
    	-p ip:主机端口:容器端口
    	-p 主机端口:容器端口
    	-p 容器端口
    -P				随机指定端口
    
  • 退出容器

    • 容器停止容器 exit
    • 容器不停止退出 Ctrl+Q+P
  • 列出容器信息

    docker ps		# 列出当前正在运行的容器
    	-a			# 列出所有容器
    	-n=?		# 显示最近创建的容器
    	-q			# 只显示容器的编号
    
  • 停止容器和启动容器

    • 启动容器 docker start 容器ID
    • 重启容器 docker restart 容器ID
    • 停止容器 docker stop 容器ID
    • 杀死容器 docker kill 容器ID
  • 重新进入容器

    1. docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

      # docker exec -it 容器id bashShell
      halley@halley-HBL-WX9:~$ sudo docker exec -it 28d0bc22ad07 /bin/bash
      [root@28d0bc22ad07 /]# ls
      bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
      dev  home  lib64  media       opt  root  sbin  sys  usr
      [root@28d0bc22ad07 /]# 
      
    2. docker attach [OPTIONS] CONTAINER

      # docker attach 容器id
      
    3. 两者区别

      docker exec:创建一个新的终端

      docker attach:进入当前运行的终端,不会启动新的进程

  • 删除容器

    docker rm [OPTIONS] CONTAINER [CONTAINER...]

其他命令

后台启动容器

docker run -d 镜像名

查看日志命令

dockr logs						# docker logs -tf --tail n 镜像ID
	-f		
	-n		--tail num 			# 显示多少条日志
	-t		

查看容器中进程信息命令

docker top 镜像ID
UID          PID         PPID         C        STIME         TTY            TIME            CMD
root        24642        24621        0        14:10        pts/0        00:00:00        /bin/bash

查看容器信息

docker inspect 容器id 

从容器内拷贝文件到主机上

# docker cp 容器id:容器内路径	目的主机路径

# 查看容器id
halley@halley-HBL-WX9:~$ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED        STATUS                     PORTS     NAMES
28d0bc22ad07   centos    "/bin/bash"   18 hours ago   Exited (0) 4 minutes ago             admiring_bassi
# 进入当前容器
halley@halley-HBL-WX9:~$ sudo docker attach 28d0bc22ad07
[root@28d0bc22ad07 /]# cd home
# 在容器中新建一个文件
[root@28d0bc22ad07 home]# touch test.go  
[root@28d0bc22ad07 home]# ls
test.go
[root@28d0bc22ad07 home]# exit
exit
# 将容器内的文件拷贝到宿主机上
halley@halley-HBL-WX9:~$ sudo docker cp 28d0bc22ad07:/home/test.go /home/halley
Preparing to copy...
Successfully copied 1.536kB to /home/halley
halley@halley-HBL-WX9:~$ ls
Desktop    Downloads    Music     Projects  Repository  Software   test.go	# 
Documents  Environment  Pictures  Public    snap        Templates  Videos

提交镜像

# docker commit -a="NAME" -m="MESSAGE" 容器id 镜像名字:版本
docker commmit 提交容器变成一个新的副本

#命令和git原理类似
docker commit -m="提交信息" -a="作者" 容器id 目标镜像:[TAG]

小结

作业练习

Docker上部署nginx服务器

  1. 搜索镜像 search
  2. 下载镜像 pull
  3. 启动容器 run
# -d 后台运行
# --name 容器名字
# -p 服务器端口
halley@halley-HBL-WX9:~$ sudo docker run -d --name nginx01 -p 4141:80 nginx
b35cdb82dc007051fc53b3219e872d57694e8d18797a1ed652de3118f2d5f401
halley@halley-HBL-WX9:~$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
b35cdb82dc00   nginx     "/docker-entrypoint.…"   12 seconds ago   Up 12 seconds   0.0.0.0:4141->80/tcp, :::4141->80/tcp   nginx01
halley@halley-HBL-WX9:~$ curl localhost:4141

# 进入容器
halley@halley-HBL-WX9:~$ sudo docker exec -it nginx01 /bin/bash
root@b35cdb82dc00:/# whereis nginx 
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@b35cdb82dc00:/# cd /etc/nginx
root@b35cdb82dc00:/etc/nginx# ls
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params
root@b35cdb82dc00:/etc/nginx# 

Docker设置内存大小

docker run -d --name NAME -p PORT:PORT -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" IMAGES

容器数据卷(基础)

进阶详解请看官网:https://docs.docker.com/storage/volumes/

什么是容器数据卷

容器数据卷其实就是一个容器与宿主机一个同步映射机制

容器的持久化和同步操作!容器间也是可以数据共享的

使用数据卷

  • 方法一:直接使用命令挂载 -v

    docker run -it -v 主机目录:容器内目录
    
  • 方法二:使用Dockerfile进行挂载

    FROM centos
    VOLUME /data		# 在根目录下创建data目录并设置为挂载点
    

具名挂载和匿名挂载

  • 具名挂载顾名思义就是挂载的数据卷有名字

    # 方式一:在运行容器时直接指定
    docker run -d -v NAME:创建的容器挂载点 --name 镜像名字 镜像 
    # 方式二:
    docker volume create my-vol
    docker run -d \
      --name=nginxtest \
      --mount source=nginx-vol,destination=/usr/share/nginx/html \
      nginx:latest
    # 方式三
    docker run -d -v 宿主机的挂载数据卷:创建的容器挂载点 --name 镜像名字 镜像 
    
  • 匿名挂载意味着挂载的数据卷没有名字

    docker run -d -v 创建的容器挂载点 --name 镜像名字 镜像
    

注意:当没指定源地址时默认的挂载地址时在/var/lib/docker/volumes下面

root@halley-HBL-WX9:/home/halley/test# cd /var/lib/docker
root@halley-HBL-WX9:/var/lib/docker# ls
buildkit  containers  engine-id  image  network  overlay2  plugins  runtimes  swarm  tmp  volumes
root@halley-HBL-WX9:/var/lib/docker# cd volumes
root@halley-HBL-WX9:/var/lib/docker/volumes# ls
4bd60d1f4562321a35ee3ea46ca1cf60fd1e9195ff2c27c0243f30e53245e89b  backingFsBlockDev  metadata.db  v_centos
root@halley-HBL-WX9:/var/lib/docker/volumes# 

DockerFile

什么是Dockerfile

Dokckerfile相当于一个脚本文件,用来创建Docker镜像,里面包括了创建Docker镜像的命令

Dockerfile格式

# Comment
INSTRUCTION arguments	# 指令 参数

编写简单的Dockerfile

  • Dockerfile

    FROM centos
    
    RUN echo "这个是简单的Dockerfile创建的镜像"
    
  • 使用build命令构建镜像 docker build -t 镜像名字:版本号 .

    halley@halley-HBL-WX9:~/test$ sudo docker build -t mycentos:1.0 .
    [+] Building 0.3s (4/5)                                                         
    [+] Building 0.4s (4/5)                                                         
    [+] Building 0.5s (4/5)                                                         
     => [internal] load .dockerignore                                          0.1s
    [+] Building 0.6s (6/6) FINISHED                                                
     => [internal] load .dockerignore                                          0.1s
     => => transferring context: 2B                                            0.0s
     => [internal] load build definition from Dockerfile                       0.1s  => => transferring dockerfile: 109B                                       0.0s  => [internal] load metadata for docker.io/library/centos:latest           0.0s  => [1/2] FROM docker.io/library/centos                                    0.0s
     => [2/2] RUN echo "这个是简单的Dockerfile创建的镜像"                                 0.4s
     => exporting to image                                                     0.0s
     => => exporting layers                                                    0.0s
     => => writing image sha256:954a522a9cdb46dced490173e4cb1318d409ffe92c171  0.0s
     => => naming to docker.io/library/mycentos:1.0                            0.0s
    halley@halley-HBL-WX9:~/test$ sudo docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    mycentos     1.0       954a522a9cdb   13 seconds ago   231MB		# 新建的Docker镜像
    nginx        latest    605c77e624dd   13 months ago    141MB
    mysql        latest    3218b38490ce   14 months ago    516MB
    centos       latest    5d0da3dc9764   17 months ago    231MB
    halley@halley-HBL-WX9:~/test$ 
    

    注意:在使用build命令构建docker镜像时,结束必须叫上 ‘.’ ,表示没有参数再输入了,否则会构建出错

Dockerfile常用命令

  • FROM指令

    # 设置构建的镜像的基础镜像
    FROM 镜像名
    
  • MAINTAINER指令(废弃了,推荐使用LABEL指令)

    # 设置镜像作者
    MAINTAINER user_name user_email
    
  • RUN指令

    # 设置在编译镜像时运行的脚本,其编写方式有两种
    # shell命令
    RUN <command>
    # 执行方式
    RUN ["executable", "param1", "param2"] (exec form)	# 必须是双引号",而不是单引号‘
    
    # 例如:
    RUN /bin/bash -c 'source $HOME/.bashrc && echo $HOME'	# shell命令
    RUN ["/bin/bash", "-c", "echo hello"]					# 执行方式
    
  • CMD指令

    # 设置在容器启动时执行的脚本,当出现多个CMD命令时,只有最后一个CMD命令生效
    CMD <shell 命令> 
    CMD ["<可执行文件或命令>","<param1>","<param2>",...]  
    CMD ["<param1>","<param2>",...]  
    

    注意:CMD指令容器启动默认执行之时,如果如果想要对一个docker指令添加参数时,必须使用完整的指令,CMD无法添加参数,例如

    # Dockerfile
    CMD docker ls -a
    # shell中
    
  • LABEL指令

    # 给镜像添加相关信息
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
    
    # 格式一
    LABEL "com.example.vendor"="ACME Incorporated"
    LABEL com.example.label-with-value="foo"
    LABEL version="1.0"
    LABEL description="This text illustrates \						# 跨行需要使用\符号
    that label-values can span multiple lines."
    # 格式二
    LABEL multi.label1="value1" multi.label2="value2" other="value3"
    # 格式三
    LABEL multi.label1="value1" \
          multi.label2="value2" \
          other="value3"
    
  • EXPOSE指令

    # 暴露镜像端口
    EXPOSE <port> [<port>/<protocol>...]
    

    EXPOSE指令默认的是tcp协议,如果需要指定为udp协议,需要指定

    EXPOSE 80/udp
    

    如果两种协议都需要,则可以都指定

    EXPOSE 80/tcp
    EXPOSE 80/udp
    

    注意:虽然在Dockerfile中指定了镜像端口,但是没有设置镜像端口与宿主机的端口映射,因此如果需要设置端口映射需要在容器启动时,需要手动加入端口映射关系,如

    docker run -p 80:80/tcp -p 80:80/udp ...
    
  • ENV

    # 设置环境变量
    ENV <key>=<value> ...
    # ENV指令有两种编写形式
    # 第一种
    ENV MY_NAME="John Doe"
    ENV MY_DOG=Rex\ The\ Dog
    ENV MY_CAT=fluffy
    # 第一种红还可以用一个ENV指令写
    ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
        MY_CAT=fluffy
    # 第二种	第二种则不可以用一个ENV实现多行书写
    ENV MY_VAR my-value
    
  • ADD

    # 在镜像中添加文件
    ADD <src> <dest>
    # 添加文件到目录下
    ADD test.txt /mydir/			# <dest>加入/表示当前,<dest>是一个目录
    
    # 将文件内容写入 mytest
    ADD test.txt /mytest			# <dest>不加/,表示当前<dest>是一个常规文件
    
    # 压缩文件,自动解压
    ADD jmeter.log.zip /myzipdir/	
    
    # 添加目录
    ADD TeamFile /
    
    # 其他文件
    ADD jmeter.log /mydir/
    
    # 多个文件
    ADD test1.txt test2.txt /mydir/
    
    # 通配符,dest 不存在自动创建
    ADD test*.txt /mydir/test/
    
    # 特殊字符串
    ADD add[[]0].txt /mydir/
    
    WORKDIR /data
    
    # 相对路径
    ADD test.txt test/				# 等价于 ADD test.txt <WORKDIR>/test/
    
    # ADD指令支持远程拉取文件
    ADD [--keep-git-dir=<boolean>] <git ref> <dir>
    
  • COPY

    COPY指令和ADD指令效果相同,都是将文件拷贝到镜像中,但是前者不支持远程拉取文件,后者支持

    # 拷贝文件 --chown只适合与Linux系统
    COPY [--chown=<user>:<group>] <src>... <dest>
    COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
    
  • ENTRYPOINT

    效果同CMD指令,都是在容器启动的过程中,执行的指令,但是效果有一点不一样,该指令可以在容器启动时添加参数,而CMD不行

    # 执行方式
    ENTRYPOINT ["executable", "param1", "param2"]
    # shell命令方式
    ENTRYPOINT command param1 param2
    

    CMDENTRYPOINT的区别

    1. RUN 在Build Image的时候执行。
    2. CMD ENTRYPOINT 在运行Image时执行。
    3. CMD 可以和ENTRYPOINT 搭配使用,也可以单个命令使用。当CMD 和ENTRYPOINT都出现在一个DockerFile中时,CMD中设置的信息(EXEC格式的)都以参数的形式提供给ENTRYPOINT命令。EntryPoint 命令没有设置时,默认是/bin/bash
    4. ENTRYPOINT的命令不可以简单被覆盖,但可以使用run 中的–entrypoint被覆盖,如果docker run时提供参数,这些参数附加在ENTRYPOINT 里面设置的内容后面。
    5. CMD 单独使用时,如果run 命令后面中提供参数,那么参数会完全覆盖CMD
  • VOLUME

    # 设置镜像的挂载点,源地址缺省默认为/var/lib/volumes
    VOLUME ["/data"]	# 形式一
    VOLUME /data		# 形式二
    # 指定源地址
    VOLUME <src> <dest>
    

    详解请看<容器数据卷>

  • USER

    # 设置当前镜像运行所属的用户ID
    USER <user>[:<group>]
    # 设置当前镜像运行所属的用户组ID
    USER <UID>[:<GID>]
    
  • WORKDIR

    # 设置工作目录,默认为根目录	/
    WORKDIR </工作目录>				# 必须从根目录开始
    # 出现多个WORKDIR,则是路径拼接
    WORKDIR /a
    WORKDIR b
    WORKDIR c
    RUN pwd							#显示 /a/b/c
    # 配合ENV变量使用
    ENV DIRPATH=/path
    WORKDIR $DIRPATH/$DIRNAME
    RUN pwd							# /path/$DIRNAME
    
  • ARG

    # 定义变量
    ARG key=value
    # 若ARG指令定义与FROM之前,那么该指令只能作用于FROM指令中
    
  • ONBUILD

    # ONBUILD指令是当其他镜像以该镜像为基础镜像而触发的指令,其后面跟着其他dockerfile指令,如
    ONBUILD ADD . /app/src
    ONBUILD RUN /usr/local/bin/python-build --dir /app/src
    

练习—编写Dockerfile文件

FROM centos

MAINTAINER halley<ccoder1024@gmail.com>

RUN ["/bin/sh","-c","echo The images is successfully created!"]

LABEL version=1.0 
LABEL description="This is a self-made images which is built on centos"

EXPOSE 10086/tcp
EXPOSE 10086/udp

ENV MY_PATH="/usr/local"

WORKDIR $MY_PATH

ADD test.go $MY_PATH/test/

COPY test.java $MY_PATH/test/

ARG MYPATH=/usr/local/data

VOLUME ["$MYPATH"]

CMD ["/bin/bash"]
  • 基于centos镜像,创建自己镜像

在这里插入图片描述

  • 使用docker inspect mycentos:1.0查看镜像详细信息

    root@halley-HBL-WX9:/home/halley/test# docker inspect mycentos:1.0
    [
        {
            "Id": "sha256:4dbf5b511defdc40236cfa1c9b39649c3a0e8644b1bb5b35979a3d6d13d22381",
            "RepoTags": [
                "mycentos:1.0"
            ],
            "RepoDigests": [],
            "Parent": "",
            "Comment": "buildkit.dockerfile.v0",
            "Created": "2023-02-16T13:50:09.73761099+08:00",
            "Container": "",			# 因为没启动容器,所以容器信息没有
            "ContainerConfig": {		# 容器配置
                "Hostname": "",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
                "AttachStdout": false,
                "AttachStderr": false,
                "Tty": false,
                "OpenStdin": false,
                "StdinOnce": false,
                "Env": null,
                "Cmd": null,
                "Image": "",
                "Volumes": null,
                "WorkingDir": "",
                "Entrypoint": null,
                "OnBuild": null,
                "Labels": null
            },
            "DockerVersion": "",
            "Author": "halley<ccoder1024@gmail.com>",		# MAINTAINER 维护者信息
            "Config": {										# 镜像配置
                "Hostname": "",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
                "AttachStdout": false,
                "AttachStderr": false,
                "ExposedPorts": {							# 暴露给宿主机端口,未进行端口映射
                    "10086/tcp": {},
                    "10086/udp": {}
                },
                "Tty": false,
                "OpenStdin": false,
                "StdinOnce": false,
                "Env": [									# 环境变量
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",	# centos自带的环境变量配置
                    "MY_PATH=/usr/local"					# 自己编写的环境变量
                ],
                "Cmd": [									# 容器启动时触发的指令
                    "ls",
                    "-l"
                ],
                "ArgsEscaped": true,
                "Image": "",
                "Volumes": {								# 挂载点
                    "/usr/local/data": {}
                },
                "WorkingDir": "/usr/local",					# 当前工作目录
                "Entrypoint": [								# 容器启动时触发的指令
                    "ls",
                    "-a"
                ],
                "OnBuild": null,
                "Labels": {									# LABEL指令 自己编写的 description和version
                    "description": "This is a self-made images which is built on centos",
                    "org.label-schema.build-date": "20210915",
                    "org.label-schema.license": "GPLv2",
                    "org.label-schema.name": "CentOS Base Image",
                    "org.label-schema.schema-version": "1.0",
                    "org.label-schema.vendor": "CentOS",
                    "version": "1.0"
                }
            },
    	...
    ]
    
  • 测试容器启动

    1. 进入mycentos终端后,会直接到工作目录/usr/local

      root@halley-HBL-WX9:/home/halley/test# docker run -it --rm centos:1.0
      [root@5f5e96083eba local]# 
      
    2. 进入mycentos终端后,输入ls,会有data目录

    3. 宿主机/var/lib/docker/volums会出现匿名挂载数据卷

    root@halley-HBL-WX9:/home/halley/test# docker run -it centos:1.0
    # 启动容器之后直接到达工作目录,工作目录下有一个data目录
    [root@e63b45b276cf local]# ls
    bin  data  etc	games  include	lib  lib64  libexec  sbin  share  src  test
    [root@e63b45b276cf local]# exit
    # 查看容器ID,上面有可以不用docker ps -a查看
    root@halley-HBL-WX9:/home/halley/test# docker ps -a
    CONTAINER ID   IMAGE        COMMAND       CREATED          STATUS                      PORTS     NAMES
    3c08d26d8655   centos       "/bin/bash"   12 minutes ago   Exited (0) 12 minutes ago             youthful_bhabha
    e63b45b276cf   centos:1.0   "/bin/bash"   18 minutes ago   Exited (0) 15 minutes ago             optimistic_chaum
    # 查看容器信息,会有一个Mounts的键值对,此处就包含了容器挂载数据卷的信息
    root@halley-HBL-WX9:/home/halley/test# docker inspect e63b45b276cf
    {
    	...
    	"Mounts": [
                {
                    "Type": "volume",
                    "Name": "6250eccc5f9e42dea97e263e5b6197d2b749bd5cca7a70b0be4d25fd4a5e96c4",
                    "Source": "/var/lib/docker/volumes/6250eccc5f9e42dea97e263e5b6197d2b749bd5cca7a70b0be4d25fd4a5e96c4/_data",
                    "Destination": "/usr/local/data",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],
    	...
    }
    

到此,自己编写的Dockerfile文件就完成了


以上就是Docker基础知识点,基本上可以使用Docker了,但是要非常熟练使用并深入了解Docker,那么以上知识点肯定不够,至少还需要掌握以下知识

  1. Docker网络
  2. Docker Compose
  3. Docker Swarm
  4. 多看官方文档

参考视频:狂神说Docker
参考文献:菜鸟教程Docker
官方地址:Docker官方地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿Halley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值