您的位置:首页 > 运维架构 > Docker

Dockerfile简介及Docker 程序部署

2020-04-07 12:26 1111 查看

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

  • 点赞
  • 收藏
  • 分享
  • 文章举报
bigfaceCatzzZ 发布了13 篇原创文章 · 获赞 1 · 访问量 830 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: