August Rush

一个还在努力成长的小火汁!

游龙当归海,海不迎我自来也。

We create our own demons.

You can reach me at augustrush0923@gmail.com
Docker极速入门
发布:2023年10月10日 | 作者:augustrush | 阅读量: 373

获取镜像

查看docker镜像存储位置

docker info | grep root

ls /var/lib/docker/image/overlay2/imagedb/content/sha256

文件存储的是json,其作用是记录镜像容器的配置关系

使用镜像

docker run -it --rm centos bash

-it:表示开启一个交互式的终端

--rm:表示退出容器时立即删除该容器

查看镜像

docker images
docker image ls
仓库名称                                     版本标签    镜像ID        创建时间        镜像大小
REPOSITORY                                      TAG        IMAGE ID       CREATED         SIZE
mysql                                           5.7        dd6675b5cfea   5 months ago    569MB
python                                          3.6        54260638d07c   21 months ago   902MB
centos                                          latest     5d0da3dc9764   2 years ago     231MB
docker.elastic.co/elasticsearch/elasticsearch   7.13.4     1c9757417a29   2 years ago     1.02GB
centos                                          7.8.2003   afb6fca791e0   3 years ago     203MB
docker.elastic.co/elasticsearch/elasticsearch   5.4.0      865382d9b822   6 years ago     511MB

查看具体镜像

docker images <image_name>

docker iamges centos
REPOSITORY   TAG        IMAGE ID       CREATED       SIZE
centos       latest     5d0da3dc9764   2 years ago   231MB
centos       7.8.2003   afb6fca791e0   3 years ago   203MB

查看指定版本的镜像

docker images <image_name>:<tag>

docker images centos:7.8.2003
REPOSITORY   TAG        IMAGE ID       CREATED       SIZE
centos       7.8.2003   afb6fca791e0   3 years ago   203MB

只查看镜像的ID

docker images -q/--quiet <image_name>:<tag>

docker images -q centos
5d0da3dc9764
afb6fca791e0

格式化显示镜像

docker images --format "{{.ID}}\t{{Repository}}"
be0738cc0750    latest
b5b9316c5ef7    latest
dd6675b5cfea    5.7
54260638d07c    3.6
5d0da3dc9764    latest
1c9757417a29    7.13.4
afb6fca791e0    7.8.2003
865382d9b822    5.4.0

docker images --format "table {{.ID}}\t{{.Tag}}\t{{.Repository}}"
IMAGE ID       TAG        REPOSITORY
be0738cc0750   latest     ops-resource-mgmt-django
b5b9316c5ef7   latest     ops
dd6675b5cfea   5.7        mysql
54260638d07c   3.6        python
5d0da3dc9764   latest     centos
1c9757417a29   7.13.4     docker.elastic.co/elasticsearch/elasticsearch
afb6fca791e0   7.8.2003   centos
865382d9b822   5.4.0      docker.elastic.co/elasticsearch/elasticsearch

这是docker自带的模板语言,具体可在搜索引擎中查找具体用法

从dockerhub查找镜像

docker search <image_name>

删除镜像

根据ID删除镜像

docker rmi <Iamge-ID>
docker rmi be0738cc0750

根据Name删除镜像

docker rmi <Name>
docker rmi hello-world

镜像管理

导出镜像

docker image save <Name>:<Tag> > <path>

docker image save centos:7.8.2003 > /opt/centos7.8.2003.tgz

导入镜像

docker image load -i <path>

docker image load -i /opt/centos7.8.2003.tgz

查看镜像详细信息

docker image inspect <ImageID>

docker image inspect afb6fca791e0

容器管理

docker run <镜像名>如果本地不存在该镜像,则会去线上下载该镜像并运行

容器内的进程必须处于前台运行状态,否则容器就会直接退出。

如果运行一个centos镜像,没有运行任何程序,该容器就会挂掉

docker run centos:7.8.2003
# 该条命令会创建多个独立的容器记录,因为容器内没有程序在跑,会直接挂掉

# 查看所以容器记录
docker ps -a

运行一个后台容器

docker run --name ping --rm -d centos ping www.baidu.com

停止一个容器

docker stop <容器ID>

查看容器日志

docker logs <容器ID>
-f: 实时刷新日志

进入容器内部

docker exec -it <容器ID/容器名> bash

查看容器的详细信息

docker container inspect <容器ID>

容器的端口映射

-p <宿主机端口号>:<容器端口号>:

docker run --name nginx_service -d -p 80:80 nginx

查看容器的端口转发情况

docker port <容器ID>

随机端口映射

-P :随机访问一个宿主机的空闲端口,映射到容器内打开的端口

容器的提交

docker commit <容器ID> <镜像名:一般命名规则是dockerhub账号+镜像名>

docker commit 164629e233ff abc/centos_vim_7.8.2003

DockerFile

dockerfile主要组成部分:

基础镜像信息 FORM centos

制作镜像操作指令 RUN yum install openssh-server -y

容器启动时执行指令 CMD ["/bin/bash"]

dockerfile指令

FROM (指定基础镜像)

MAINTAINER (指定维护者信息 可以没有)

RUN (运行指定命令)

ADD (添加宿主机的文件到容器中内,会自动解压文件)

WORKDIR (设置当前工作目录)

VOLUME (设置卷,挂载宿主机目录)

EXPOSE (映射宿主机端口)

CMD (设置容器启动后要干的事情)

COPY (拷贝宿主机的文件到容器中内)

ENV (设置环境变量)

ENTRYPOINT (同CMD语义差不多,可以接收CMD命令作为参数)

制作一个dockerfile

  1. 创建一个名为Dockerfile的文件,并写入如下内容:
FROM nginx
RUN mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bak
RUN echo "<h1> Hello World!I'm August Rush" > /usr/share/nginx/html/index.html
  1. 进入Dockerfile文件所在目录中,并执行命令:

``` docker build .

docker images REPOSITORY TAG IMAGE ID CREATED SIZE 10069c85c945 15 seconds ago 187MB nginx latest 61395b4c586d 2 weeks ago 187MB ```

  1. 修改镜像名字:

``` docker tag :

docker tag 10069c85c945 my-nginx

docker images REPOSITORY TAG IMAGE ID CREATED SIZE my-nginx latest 10069c85c945 48 seconds ago 187MB nginx latest 61395b4c586d 2 weeks ago 187MB ```

  1. 执行镜像

docker run -d -p 80:80 --rm my-nginx

docker build-t参数可以在构建镜像时指定镜像名及标签,还可指定dockerfile所在目录

docker build -t <Name>:<Tag> <path>

docker build -t my-nginx:latest .
docker build -t my-nginx:latest /tmp/documents/

Dockerfile指令详解

COPY

copy指令从宿主机复制文件/目录到新的一层镜像内

COPY /path/to/host/filename /path/to/image/filename

COPY learn.txt /home/

支持多个文件,以及通配符形式。语法要满足Golang的filepath.Match

COPY指令能够保留源文件的元数据,如权限、访问时间等等。

ADD

特性和COPY基本一致,不过多了些功能

  1. 源文件是一个URL,此时docker引擎会下载该链接,放入目标路径,且权限自动设为600
  2. 源文件是一个URL,且是一个压缩包,不会自动解压,得单独用RUN指令解压
  3. 源文件是一个压缩文件,且是gzip,bzip2,xz,tar,ADD指令会自动解压缩该文件到目标路径

Dockerfile官方更为推荐使用COPY,ADD包含了更多复杂的功能,且ADD会使构建缓存失效,导致镜像构建缓慢。

CMD

用法:

CMD ["参数1", "参数2"]

# centos镜像默认执行下面的命令
CMD["/bin/bash"]

# 查看版本 
CMD["cat", "/etc/os-release"]

容器内运行程序问题

这里要注意的是,Docker不是虚拟机的概念,虚拟机里的程序运行,基本上都是在后台运行,利用systemctl后台运行。但是容器内没有后台进程的概念,必须在前台运行,否则容器会自动停止运行。

# 这样的写法是错误的,容器会立即退出
CMD systemctl start nginx
# 因为systemctl是希望以守护进程形式(daemon)启动应用,且CMD命令会转化为CMD ["sh", "-c", "systemctl start nginx"]
# 这样的命令主进程是sh解释器,执行完毕后立即结束了,因此容器也就退出了。

# 因此正确的做法应该是
CMD ["nginx", "-g", "daemon off"]

ENTRYPOINT

和RUN指令一样,分为两种格式

  • exec
  • shell

作用和CMD一样,都是在指定容器启动程序以及参数。

当指定了ENTRYPOINT之后,就会把CMD的内容当作参数传递给ENTRYPOINT指令。

实例:

  1. 准备一个dockerfile如下:

    dockerfile FROM centos:7.8.2003 RUN rpm --rebuilddb && yum install epel-release -y RUN rpm --rebuilddb && yum install curl -y CMD ["curl", "-s", "http://ipinfo.io/ip"]

  2. 构建镜像,并启动容器查看运行结果

    ```bash

    docker build -t cmd_curl .

    docker images REPOSITORY TAG IMAGE ID CREATED SIZE cmd_curl latest 817fe5c110a4 17 seconds ago 635MB

    docker run cmd_curl 116.48.102.106 ```

  3. 当想基于CMD的命令传入其他参数时,就会出现问题

    ```bash

    docker run cmd_curl -I docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-I": executable file not found in $PATH: unknown.

    后面接收的是一个新命令,如果传了CMD的话,就不会执行dockerfile中的CMD指令而执行最新的CMD指令

    docker run cmd_curl echo "hello world" hello world

    当传了完整的命令及新参数就能解决这个问题

    docker run cmd_curl curl -s http://ipinfo.io/ip -I HTTP/1.1 405 Method Not Allowed Connection: close Content-Length: 18 Allow: GET, OPTIONS Content-Type: text/plain; charset=utf-8 Date: Tue, 10 Oct 2023 07:08:36 GMT Server: fasthttp Strict-Transport-Security: max-age=2592000; includeSubDomains Via: 1.1 google X-Envoy-Upstream-Service-Time: 0 ```

  4. 解决这个痛点就需要ENTRYPOINT,重写构建dockerfile文件:

    dockerfile FROM centos:7.8.2003 RUN rpm --rebuilddb && yum install epel-release -y RUN rpm --rebuilddb && yum install curl -y ENTRYPOINT ["curl", "-s", "http://ipinfo.io/ip"]

    ```bash

    docker build -t entrypoint_curl .

    docker images REPOSITORY TAG IMAGE ID CREATED SIZE cmd_curl latest 817fe5c110a4 9 minutes ago 635MB entrypoint_curl latest b0b336fee624 9 minutes ago 635MB

    docker run entrypoint_curl 116.48.102.106

    docker run entrypoint_curl -I HTTP/1.1 405 Method Not Allowed Connection: close Content-Length: 18 Allow: GET, OPTIONS Content-Type: text/plain; charset=utf-8 Date: Tue, 10 Oct 2023 07:12:48 GMT Server: fasthttp Strict-Transport-Security: max-age=2592000; includeSubDomains Via: 1.1 google X-Envoy-Upstream-Service-Time: 0 ```

ENV

设置环境变量

ENV NAME="abc"
ENV AGE="18"
ENV MYSQL_VERSION=5.6

# 后续所有的操作,通过$<变量名>就可以直接获取变量值了

ARG

ARG和ENV一样,都是设置环境变量

区别在于ENV无论是在镜像构建时,还是容器运行时,通过ENV设置的变量都可以使用。

ARG只是用于构建镜像需要设置的变量,容器运行时就消失了

EXPOSE

指定容器运行时对外提供的端口服务

WORKDIR

用于在dockerfile中,目录的切换,更改工作目录

USER

用于改变环境,用于切换用户

USER root


  • 标签云

  • 支付宝扫码支持一下

  • 微信扫码支持一下



基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建

京ICP备20007446号-1 & 豫公网安备 41100202000460号

网站地图 & RSS | Feed