docker学习

Sl0th Lv4

docker学习

dockerfile启动环境

事先编写好dockerfile,在其所在目录下打开终端,从dockerfile建立镜像

1
docker build -t nginx:v1 . 

-t snginx:v1 给新构建的镜像取名为nginx,并设定版本为 v1 。

⚠️不要忘记版本号后空格加一个. 最后的.代表本次执行的上下文路径

上下文路径:是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。默认上下文路径就是 Dockerfile 所在的位置a

⚠️上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

使用docker images命令查看镜像是否创建成功,若成功会发现有一个刚创建的nginx镜像

1
2
REPOSITORY    TAG   IMAGE ID       CREATED        SIZE
nginx v1 3efd9464e2a0 2 hours ago 134MB

利用该镜像启动容器,注意端口映射

1
2
docker run -p 本地端口:容器端口 镜像名称
docker run --name docker_nginx_v1 -d -p 127.0.0.1:5001:80 nginx:v1

意思是启动一个名字为docker_nginx_v1的容器,使用nginx:v1镜像,并将本机127.0.0.1:5001映射到该容器的80端口(因为nginx的默认端口是80),因此建立成功后可以从127.0.0.1:5001访问该环境

注:

1.容器默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在容器的端口后面加上 /udp

2.-d:在后台运行

3.-it:交互式方式运行

4.-p:指定端口

docker ps查看正在运行的容器

1
2
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS                    NAMES
dd0c50ae3ef8 nginx:v1 "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 127.0.0.1:5001->80/tcp docker_nginx_v1

访问127.0.0.1:5001

image-20220501191611894
image-20220501191611894

dockerfile的内容

1
2
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

使用dockerfile构建镜像

Dockerfile整体就两类语句组成:

  • # Comment 注释信息
  • Instruction arguments 指令 参数,一行一个指令。

⚠️

  1. Dockerfile文件名首字母必须大写
  2. Dockerfile指令不区分大小写,但是为方便和参数做区分,通常指令使用大写字母。
  3. Dockerfile中指令按顺序从上至下依次执行。
  4. Dockerfile中第一个非注释行必须是FROM指令,用来指定制作当前镜像依据的是哪个基础镜像。
  5. Dockerfile中需要调用的文件必须跟Dockerfile文件在同一目录下,或者在其子目录下,父目录或者其它路径无效。

FROM和RUN

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

shell格式

1
RUN <命令行命令>

<命令行命令> 等同于,在终端操作的 shell 命令。

exec格式

1
2
3
RUN ["可执行文件", "参数1", "参数2"]
RUN ["./test.php", "dev", "offline"]
# 等价于 RUN ./test.php dev offline

如果有多条命令执行,不要分成多个RUN语句,dockerfile的指令每执行一次都会在 docker 上新建一层,过多无意义的层,会造成镜像膨胀过大

正确写法是用\表示分行,&&链接命令

1
2
3
4
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz

COPY

复制指令,可以从上下文目录中复制文件或目录到容器内指定路径

1
2
COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
  • **[–chown=:]**:可选参数,用户改变复制到容器内文件的拥有者和属组

  • **<源路径>**:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    pattern:
    { term }
    term:
    '*' 匹配0或多个非路径分隔符的字符
    '?' 匹配1个非路径分隔符的字符
    '[' [ '^' ] { character-range } ']' 字符组(必须非空)
    c 匹配字符c(c != '*', '?', '\\', '[')
    '\\' c 匹配字符c
    character-range:
    c 匹配字符c(c != '\\', '-', ']')
    '\\' c 匹配字符c
    lo '-' hi 匹配区间[lo, hi]内的字符

  • **<目标路径>**:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建

镜像源拉取超时问题

将dockerfile中的

k8s.gcr.io —> lank8s.cn
gcr.io –> gcr.lank8s.cn

  • 标题: docker学习
  • 作者: Sl0th
  • 创建于 : 2022-01-12 22:33:59
  • 更新于 : 2024-07-03 22:35:05
  • 链接: http://sl0th.top/2022/01/12/docker学习/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论