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
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自带的模板语言,具体可在搜索引擎中查找具体用法
docker search <image_name>
docker rmi <Iamge-ID>
docker rmi be0738cc0750
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主要组成部分:
基础镜像信息 FORM centos
制作镜像操作指令 RUN yum install openssh-server -y
容器启动时执行指令 CMD ["/bin/bash"]
FROM (指定基础镜像)
MAINTAINER (指定维护者信息 可以没有)
RUN (运行指定命令)
ADD (添加宿主机的文件到容器中内,会自动解压文件)
WORKDIR (设置当前工作目录)
VOLUME (设置卷,挂载宿主机目录)
EXPOSE (映射宿主机端口)
CMD (设置容器启动后要干的事情)
COPY (拷贝宿主机的文件到容器中内)
ENV (设置环境变量)
ENTRYPOINT (同CMD语义差不多,可以接收CMD命令作为参数)
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
Dockerfile
文件所在目录中,并执行命令:``` docker build .
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
```
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 ```
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/
copy指令从宿主机复制文件/目录到新的一层镜像内
COPY /path/to/host/filename /path/to/image/filename
COPY learn.txt /home/
支持多个文件,以及通配符形式。语法要满足Golang的filepath.Match
COPY指令能够保留源文件的元数据,如权限、访问时间等等。
特性和COPY基本一致,不过多了些功能
Dockerfile官方更为推荐使用COPY,ADD包含了更多复杂的功能,且ADD会使构建缓存失效,导致镜像构建缓慢。
用法:
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"]
和RUN指令一样,分为两种格式
作用和CMD一样,都是在指定容器启动程序以及参数。
当指定了ENTRYPOINT
之后,就会把CMD
的内容当作参数传递给ENTRYPOINT
指令。
实例:
准备一个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"]
构建镜像,并启动容器查看运行结果
```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 ```
当想基于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.
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 ```
解决这个痛点就需要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 NAME="abc"
ENV AGE="18"
ENV MYSQL_VERSION=5.6
# 后续所有的操作,通过$<变量名>就可以直接获取变量值了
ARG和ENV一样,都是设置环境变量
区别在于ENV无论是在镜像构建时,还是容器运行时,通过ENV设置的变量都可以使用。
ARG只是用于构建镜像需要设置的变量,容器运行时就消失了
指定容器运行时对外提供的端口服务
用于在dockerfile中,目录的切换,更改工作目录
用于改变环境,用于切换用户
USER root
基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建