Dockerfile简介及Docker 程序部署
00. Dockerfile
Dockerfile 是一个用来构建镜像的文本文件
1. 示例
# FROM:定制的镜像都是基于 FROM 的镜像 FROM ubuntu # 镜像作者 MAINTAINER bigfaceCat xxxx@xxx.cn # RUN:用于执行后面跟着的命令行命令。 RUN apt-get update RUN apt-get install -y gcc ENTRYPOINT ["gcc"]
测试
:~/share/02dockfile$ vim Dockerfile :~/share/02dockfile$ docker build -t my_gcc . Sending build context to Docker daemon 2.048kB Step 1/5 : FROM ubuntu ---> 775349758637 Step 2/5 : MAINTAINER bigfaceCat xxxx@xxx.cn ---> Running in 791b7b58b2f5 Removing intermediate container 791b7b58b2f5 ---> 0fe7b8555fd2 Step 3/5 : RUN apt-get update ---> Running in 6c47769437ec
2. workdir
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
格式:
WORKDIR <工作目录路径>
dockerfile
from ubuntu:latest maintainer bigfaceCat xxxx@xxx.cn workdir /a run touch a.txt workdir b run touch 2.txt
构建生成镜像
:~/share/03dockfile$ docker build -t mytest:v1.0 . Sending build context to Docker daemon 2.048kB Step 1/6 : from ubuntu:latest ---> 775349758637 Step 2/6 : maintainer bigfaceCat xxxx@xxx.cn ---> Running in de2c135a84d8 Removing intermediate container de2c135a84d8 ---> d8dbd3fb7e4e Step 3/6 : workdir /a ---> Running in ab6eab6abd72 Removing intermediate container ab6eab6abd72 ---> 3775363f0fab Step 4/6 : run touch a.txt ---> Running in ffdf87379b35 Removing intermediate container ffdf87379b35 ---> cb43988121cb Step 5/6 : workdir b ---> Running in b57fcb1a4bef Removing intermediate container b57fcb1a4bef ---> 7a00fe70187d Step 6/6 : run touch 2.txt ---> Running in 42bc3893d8b1 Removing intermediate container 42bc3893d8b1 ---> 2b6705cef44d Successfully built 2b6705cef44d Successfully tagged mytest:v1.0
查看构建的镜像
:~/share/03dockfile$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mytest v1.0 2b6705cef44d 28 seconds ago 64.2MB :~/share/03dockfile$ docker run -it mytest:v1.0 /bin/bash root@2d728bb1e516:/a/b# root@2d728bb1e516:/a/b# pwd /a/b root@2d728bb1e516:/a/b# root@2d728bb1e516:/# find /a a a/b a/b/2.txt a/a.txt root@2d728bb1e516:/#
3. run
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
# RUN命令的格式 shell格式 RUN <命令行命令> # <命令行命令> 等同于,在终端操作的 shell 命令。 exec格式 RUN ["可执行文件", "参数1", "参数2"] # 例如: # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
4. cpoy
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
格式:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径> COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"] #参数描述 [--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。 <源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。 <目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。 示例: COPY hom* /mydir/ COPY hom?.txt /mydir/
5. add
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
- ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
- ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
Dockerfile
from ubuntu:latest maintainer bigfaceCat xxxx@xxx.cn add test.tar.gz /data/
6. cmd
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
作用: 为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
**注意:**如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
CMD <shell 命令> CMD ["<可执行文件或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
7. entrypoint
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖
ENTRYPOINT 指令指定的程序。
**优点:**在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
**注意:**如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。
FROM nginx ENTRYPOINT ["nginx", "-c"] # 定参 CMD ["/etc/nginx/nginx.conf"] # 变参
不传参运行
$ docker run nginx:test #容器内会默认运行以下命令,启动主进程。 #nginx -c /etc/nginx/nginx.conf
传参运行
$ docker run nginx:test -c /etc/nginx/new.conf #容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件) #nginx -c /etc/nginx/new.conf
8. expose
声明端口。
作用:
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
格式:
EXPOSE <端口1> [<端口2>...]
9. 容器中运行程序
测试案例test.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <errno.h> #include <netinet/in.h> #include <arpa/inet.h> int main() { int listen_sock = socket(AF_INET, SOCK_STREAM, 0); if (0 <= listen_sock) { struct sockaddr_in stServerAddr; stServerAddr.sin_family = AF_INET; stServerAddr.sin_addr.s_addr = htonl(INADDR_ANY); stServerAddr.sin_port = htons(55555); if ((0 == bind(listen_sock, (struct sockaddr *)&stServerAddr, sizeof(stServerAddr))) && (0 == listen(listen_sock, 10))) { struct sockaddr_in stClientAddr; socklen_t AddrLen = sizeof(stClientAddr); int data_sock = -1; while (0 <= (data_sock = accept(listen_sock, (struct sockaddr *)&stClientAddr, &AddrLen))) { char szBuff[256]; int recv_len = 0; while (0 < (recv_len = recv(data_sock, szBuff, sizeof(szBuff), 0))) { send(data_sock, szBuff, recv_len, 0); } close(data_sock); } } else { perror("bind:"); } } else { perror("create listen socket:"); } return -1; }
编译程序
:~/share/06echo$ gcc test.c -o myecho :~/share/06echo$ ls Dockerfile hello.txt myecho test.c test.tar.gz
第一种方式
Dockerfile
from ubuntu:latest maintainer bigfaceCat xxxx@xxx.cn copy myecho / expose 55555 #启动容器的时候执行myecho 必须使用相对路径 cmd ./myecho
命令:
:~/share/06echo$ docker build -t mytest:v1.4 . Sending build context to Docker daemon 14.85kB Step 1/5 : from ubuntu:latest ---> 775349758637 Step 2/5 : maintainer bigfaceCat xxxx@xxx.cn ---> Using cache ---> d8dbd3fb7e4e Step 3/5 : copy myecho / ---> Using cache ---> 609ab81360e8 Step 4/5 : expose 55555 ---> Using cache ---> ff02cb9c73b8 Step 5/5 : cmd myecho ---> Using cache ---> 87f44d74903b Successfully built 87f44d74903b Successfully tagged mytest:v1.4 :~/share/06echo$ docker run mytest:v1.4 :~/share$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e7cd0e815dc1 mytest:v1.4 "/bin/sh -c ./myecho" About a minute ago Up About a minute 55555/tcp crazy_chatelet
查看IP和测试
:~/share$ docker inspect crazy_chatelet :~/share$ nc 172.17.0.7 55555 hello world hello world alkfjsdlkjflasdkjflskdjf alkfjsdlkjflasdkjflskdjf #退出docker :~/share$ docker kill crazy_chatelet crazy_chatelet
第二种方式
Dockerfile
from ubuntu:latest maintainer bigfaceCat xxxx@xxx.cn copy myecho / expose 55555 #启动容器的时候执行myecho entrypoint ./myecho
命令
:~/share/07entrypoint$ docker build -t mytest:v1.5 . Sending build context to Docker daemon 14.85kB Step 1/5 : from ubuntu:latest ---> 775349758637 Step 2/5 : maintainer bigfaceCat xxxx@xxx.cn ---> Using cache ---> d8dbd3fb7e4e Step 3/5 : copy myecho / ---> Using cache ---> 609ab81360e8 Step 4/5 : expose 55555 ---> Using cache ---> ff02cb9c73b8 Step 5/5 : entrypoint ./myecho ---> Running in fe47f45aca03 Removing intermediate container fe47f45aca03 ---> d30cd898d9a7 Successfully built d30cd898d9a7 Successfully tagged mytest:v1.5
测试
:~/share/07entrypoint$ docker run -P mytest:v1.5 pensive_khorana :~/share$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6617ee48c3de mytest:v1.5 "/bin/sh -c ./myecho" 54 seconds ago Up 52 seconds 0.0.0.0:32772->55555/tcp determined_euclid :~/share$ nc localhost 32772 lkajfdslkjf lkajfdslkjf lkafjsdlkfjlksdajfalkdsj lkafjsdlkfjlksdajfalkdsj lakfjsdlkfj lakfjsdlkfj
参考文档
Docker官方英文资源:
docker官网:http://www.docker.com
Docker windows入门:https://docs.docker.com/windows/
Docker Linux 入门:https://docs.docker.com/linux/
Docker mac 入门:https://docs.docker.com/mac/
Docker 用户指引:https://docs.docker.com/engine/userguide/
Docker 官方博客:http://blog.docker.com/
Docker Hub: https://hub.docker.com/
Docker开源:https://www.docker.com/open-source
Docker中文资源:
Docker中文网站:http://www.docker.org.cn
Docker入门教程: http://www.docker.org.cn/book/docker.html
Docker安装手册:http://www.docker.org.cn/book/install.html
一小时Docker教程 :https://blog.csphere.cn/archives/22
Docker纸质书:http://www.docker.org.cn/dockershuji.html
DockerPPT:http://www.docker.org.cn/dockerppt.html
- 点赞
- 收藏
- 分享
- 文章举报
- docker简介和常用命令“易读”
- podman和docker对比
- Linux安装Nginx(非Docker)
- 安装Docker(附安装最新版本教程)
- 安装Docker-Win10环境-图解轻松学Docker&K8S
- Docker网络模式与配置Docker自定义网络(bridge模式)
- k8s中部署prometheus常用exporter
- Docker Quickstart Terminal windows10系统下出现闪退的解决方案
- Docker搭建MySQL主从复制
- docker
- Docker底层网络经典文章分享
- Docker Desktop for Mac安装Kubernetes解决kubernetes is starting...
- 树莓派docker搭建配置
- Docker+基本命令
- Docker+Dockerfile
- Docker-Machine
- Docker安装配置
- Docker镜像推送到阿里云
- Boot2Docker
- Docker 高可用集群