Docker / 云原生

Docker基本知识学习教程

浅时光博客 · 2月28日 · 2022年 24390次已读

Docker基础命令使用


查看Docker版本原文链接:https://www.dqzboy.com

[[email protected] ~]# docker version
Client: Docker Engine – Community	#docker客户端
 Version:           20.10.12		#客户端版本号
 API version:       1.41			#API版本号
 Go version:        go1.16.12		#使用的Go版本
 Git commit:        e91ed57		#此次版本提交的commit ID
 Built:             Mon Dec 13 11:45:41 2021
 OS/Arch:           linux/amd64		#系统架构
 Context:           default
 Experimental:      true

Server: Docker Engine – Community	#Server引擎端
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.12
  Git commit:       459d0df
  Built:            Mon Dec 13 11:44:05 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:				#containder信息
  Version:          1.4.12		#containder版本
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:					#docker引擎,核心组件
  Version:          1.0.2		#版本号
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

查看Docker信息

[[email protected] ~]# docker info
Client:		#客户端信息
 Context:    default
 Debug Mode: false	#Debug模式管理
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.7.1-docker)
  scan: Docker Scan (Docker Inc., v0.12.0)

Server:		#服务端信息
 Containers: 0	#当前宿主机上有多少个容器
  Running: 0	#当前宿主机上运行的容器数量
  Paused: 0	#当前宿主机上暂停的容器数量
  Stopped: 0	#当前宿主机上停止的容器数量
 Images: 0	#当前宿主机上有多少个镜像
 Server Version: 20.10.12
 Storage Driver: overlay2	#使用的存储驱动,overlay2
  Backing Filesystem: xfs	#使用overlay2存储系统格式必须为xfs
  Supports d_type: true		#使用overlay2必须开启d_type
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file	#日志存储类型; json-file会存储在本地,存储在Docker Root Dir指定的路径下
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  #以下支持日志存储的方式
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive		#Swarm未启动
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc	#RunC 是一个轻量级的工具,它是用来运行容器的
 Init Binary: docker-init
 containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc version: v1.0.2-0-g52b36a2
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.4.179-1.el7.elrepo.x86_64	#系统内核版本
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 7.749GiB
 Name: localhost.localdomain
 ID: 7FLQ:ERSG:BZNW:ERAA:UVWS:QDBW:ADGD:BZ7E:ADTV:WFWU:XKCX:TNPS
 Docker Root Dir: /data/docker		#docker数据存储路径,可更改,建议SSD存储单独挂载
 Debug Mode: false
 Registry: https://index.docker.io/v1/	#默认使用的镜像仓库
 Labels:
 Experimental: false
 Insecure Registries:	#针对于镜像仓库不是https方式访问的,可加入到下面中
  127.0.0.0/8
 Registry Mirrors:
  https://a7ye1cuu.mirror.aliyuncs.com/
 Live Restore Enabled: true	#重启docker进程不会重启正在运行的容器

查看系统是否支持d_type

[[email protected] ~]# xfs_info /

搜索Docker文章来源(Source):浅时光博客镜像

[[email protected] ~]# docker search nginx
  • 说明:
    • DESCRIPTION:描述信息
    • OFFICIAL:OK则表示为官方制作的镜像

拉取Docker镜像

[[email protected] ~]# docker pull nginx
  • 说明:
    • 后面不添加tag则默认拉取最新的镜像(latest)
    • 如果本地已经存在相同的镜像则不会重新拉取(镜像地址、名称以及tag一致)
    • 如果pull后面没有指定镜像地址url则默认拉取docker hub上的镜像

Image TAG操作

更改镜像TAG

  • 语法:docker tag 源镜像存储库:TAG  目标镜像存储库:TAG
[[email protected] ~]# docker tag nginx:latest docker.devops.com/nginx:1.20.1

运行Docker容器

  • 语法:docker run 镜像存储库/镜像名称:tag号
前台启动:
[[email protected] ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    605c77e624dd   6 weeks ago   141MB
[[email protected] ~]# docker run -it nginx:latest /bin/bash
[email protected]:/#

后台启动:-d参数
[[email protected] ~]# docker container run -it -d nginx:latest /bin/bash
eee23811d4ec6b5a5e8903ae98eb8487c84157da6cbeb6ad14551b45a7dd3b64

[[email protected] ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
eee23811d4ec   nginx:latest   "/docker-entrypoint.…"   2 seconds ago   Up 2 seconds   80/tcp    dazzling_wiles

[[email protected] ~]# docker container exec -it eee23811d4ec /bin/bash
[email protected]:/# exit
exit
[[email protected] ~]# docker container ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
eee23811d4ec   nginx:latest   "/docker-entrypoint.…"   30 seconds ago   Up 30 seconds   80/tcp    dazzling_wiles

指定容器名称喝容器暴露端口
[[email protected] ~]# docker container run -it -d -p 8080:80 --name nginx-web nginx /bin/bash

浏览器访问宿主机IP+8080端口

查看容器日志信息

docker logs -f <CONTAINER ID或NAMES>

查看宿主机的容器

  • docker ps       #查看正在运行的容器
  • docker ps -a    #查看宿主机上所有的容器
  • docker ps -q    #查看正在运行的容器的ID
  • docker ps -qa   #查看宿主机上所有的容器ID

进入到指定容器里

docker exec -it <CONTAINER ID或NAMES>

容器文件拷贝操作

语法:
#本机文件拷贝至容器中
docker cp 本机文件 CONTAINER ID:目标路径

#容器中文件拷贝至本机
docker cp CONTAINER ID:文件名称 本机路径 

Dockerfile基本指令


FROM

继承基础镜像,FROM在Dockerfile中是必须使用的指令,而且必须是第一条指令

说明:在Dockerfile文件中ARG是唯一一个可以用于FROM之前的指令;ARG指令用于定义参数名称以及对应的默认值;该默认值可以在构建命令 docker build 中用 –build-arg <参数名>=<值> 来覆盖

注意:一个Dockerfile文件可以有多个FROM指令,来创建多个镜像或者使用其中一个阶段作为另一个阶段的依赖项。

  • 格式
FROM <image> [AS <name>]
FROM <image>[:<tag>] [AS <name>]
FROM <image>[@<digest>] [AS <name>]
  • 例子
ARG  CODE_VERSION=latest
FROM nginx:${CODE_VERSION}
…
FROM mysql:${CODE_VERSION}
…

MAINTAINER(弃用)

镜像制作者信息;比如制作者的名称,邮箱等信息,都可以在MAINTAINER指令中标示出来。

LABEL

给构建的镜像打标签;可以使用LABEL指令替代MAINTAINER

  • 格式
LABEL <key>=<value> <key>=<value> <key>=<value> ...

RUN

用来执行SHELL命令

  • 格式
RUN <command> (shell格式)
RUN ["executable", "parameter1", "parameter2"] (exec格式)

注意:executable为可执行的命令;parameter1和2为执行命令后面跟的参数;采用exec格式指令将会被解析成json格式所以不能使用单引号

EXPOSE

指定容器监听的端口号;给我们制作的容器在运行时监听指定的端口号,并且可以指定端口协议是udp还是tcp,默认为tcp协议。

注意:EXPOSE指令不会对外暴露端口号,所以外部是无法通过EXPOSE监听的端口号进行访问到容器的;如果需要对外暴露端口需要在运行docker run指令时通过-p文章来源(Source):浅时光博客数将容器监听端口映射至宿主机端口

  • 格式
EXPOSE <port> [<port>/<protocol>...]

CMD

启动容器默认执行的命令;对应K8s deployment里面的ARGS

  • 格式
CMD ["executable", "parameter1", "parameter2"](exec格式,首选)
CMD ["parameter1","parameter2"](给ENTRYPOINT提供默认参数)
CMD command parameter1 parameter2(shell格式)

ENTRYPOINT

启动容器真正执行的命令;对应K8s deployment里面的COMMAND

注意:CMD跟ENTRYPOINT在dockerfile文件中必须有一个;如果CMD跟ENTRYPOINT都有,那么ENTRYPOINT为程序启动命令,而CMD则会当做ENTRYPOINT的启动参数

  • 格式
ENTRYPOINT ["executable", "parameter1", "parameter2"] (执行格式,首选)
ENTRYPOINT command parameter1 parameter2 (shell格式)

VOLUME

创建挂载点;docker不建议保留容器文件的。但是有些我们需要进行数据持久化,就需要使用VOLUME指令进行数据的保存

  • 格式
VOLUME ["/data"]

ENV

配置环境变量

  • 格式
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

COPY

将主机的文件复制到镜像内,如果目的位置不存在,Docker会自动创建所有需要的目录结构,但是它只是单纯的复制,并不会去做文件提取和解压工作

  • 格式
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径>",... "<目标路径>"]

ADD

将主机的文件复制到镜像内;

注意:如果你复制的是一个压缩包,压缩格式为tar tar.gz gzip bzip2 以及xz的情况下,那么拷贝至容器中后会自动帮我们解压

  • 格式
ADD <源路径>... <目标路径>
ADD ["<源路径>",... "<目标路径>"](路径包含空格的必须使用这种格式)

WORKDIR

为接下来的Dockerfile指令指定当前工作目录,可多次使用,如果使用的是相对路径,则相对的是上一个工作目录,类似shell中的cd命令

  • 格式
WORKDIR /path/to/workdir

USER

为接下来的Dockerfile指令指定用户

  • 格式
USER <user>[:<group>] or
USER <UID>[:<GID>]

Docker镜像制作实操


1、创建构建目录

[[email protected] ~]# mkdir dockerbuild
[[email protected] ~]# cd dockerbuild/
[[email protected] dockerbuild]# ls
nginx-1.20.2.tar.gz	#此文件用来测试ADD指令解压

2、编写Dockerfile

[[email protected] dockerbuild]# vim Dockerfile
ARG CODE_VERSION=latest
FROM nginx:${CODE_VERSION}
LABEL user="dqzboy"
RUN mkdir -p /opt/data
EXPOSE 80
CMD ls /opt
ADD ./nginx-1.20.2.tar.gz /opt/data/
USER nginx

说明:在Dockerfile中不建议同一个指令写多行,这样对镜像构建的层数会增加,大小也会增加

3、执行Dockerbuild

[[email protected] dockerbuild]# docker build -t nginx:test .
Sending build context to Docker daemon  1.065MB
Step 1/8 : ARG CODE_VERSION=latest
Step 2/8 : FROM nginx:${CODE_VERSION}
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete 
a9edb18cadd1: Pull complete 
589b7251471a: Pull complete 
186b1aaa4aa6: Pull complete 
b4df32aa5a72: Pull complete 
a0bcbecc962e: Pull complete 
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
 ---> 605c77e624dd
Step 3/8 : LABEL user="dqzboy"
 ---> Running in ce207d3cd193
Removing intermediate container ce207d3cd193
 ---> 460d8c9fe6b4
Step 4/8 : RUN mkdir -p /opt/data
 ---> Running in abb022bf6313
Removing intermediate container abb022bf6313
 ---> 4351cc5281de
Step 5/8 : EXPOSE 80
 ---> Running in f3ab52ae69f4
Removing intermediate container f3ab52ae69f4
 ---> 467c37a81979
Step 6/8 : CMD ls /opt
 ---> Running in 52268dae069b
Removing intermediate container 52268dae069b
 ---> 6df238b44d40
Step 7/8 : ADD ./nginx-1.20.2.tar.gz /opt/data/
 ---> d22f60131ab7
Step 8/8 : USER nginx
 ---> Running in b5cb554091ac
Removing intermediate container b5cb554091ac
 ---> 8cfb7c300a8c
Successfully built 8cfb7c300a8c
Successfully tagged nginx:test

4、运行Docker容器

[[email protected] dockerbuild]# docker container run -it --rm nginx:test /bin/bash
[email protected]:/$ ls /opt/data/
nginx-1.20.2
[email protected]:/$ ls /opt/data/nginx-1.20.2/
CHANGES  CHANGES.ru  LICENSE  README  auto  conf  configure  contrib  html  man  src
  • 参数说明:--rm,容器运行结束后删除容器文件(测试时建议添加该参数)

您也可以参考下方我之前写的Docker的文章结合本篇内容进行学习。

Docker介绍与实操

2020-2-15 1

本文作者:浅时光博客
原文链接:https://www.dqzboy.com/9920.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以超链接形式标明文章原始出处和作者信息
免责声明:本站提供的内容仅限于个人学习和研究使用;禁止将内容用于商业或非法用途。下载后请在24小时内彻底删除,否则后果由用户承担。访问和下载本站内容即表示您已同意上述条款。

2 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!

  1. zhuzai广东·深圳2022-9-22 · 8:11

    学习学习,谢谢作者

  2. zhuzai广东·深圳2022-9-21 · 12:46

    正在学习这个,谢谢作者