用docker部署c/c++程序,首先需要一个Linux的基础镜像,可以是ubuntu、centos等。但最近docker都流行用alpine作为基础镜像,因为alpine最大的优点是体积小。先下载一个alpine的镜像玩玩
docker pull alpine
查看一下镜像的大小
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 3f53bb00af94 2 weeks ago 4.41MB
只有4M多,作为基础镜像确实很理想。相比之下,debian要去到80几M,ubuntu 180几M,这么大的体积也不利于部署。
下载完镜像,可以把这个迷你的linux启动起来,进去玩玩
docker run -it alpine /bin/sh
进去玩完以后,按exit命令退出来。然后用docker ps -a查看所有容器,会看到
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75c17acca2e9 alpine "/bin/sh" 43 seconds ago Exited (0) 13 seconds ago stoic_wozniak
随着我们退出,容器的状态也变成Exited。如果希望这个容器继续运行,可以输入
docker start container_id
其中的container_id是docker ps -a中查看到的。要进入这个容器,输入
docker exec -it container_id /bin/sh
回到正题,要在这个alpine容器中编译c/c++程序。先在容器里面编写一个最简单的hello world
#include <stdio.h>
int main()
{
printf("Hello world\n");
}
PS:这个alpine之中各种命令都是使用busybox的,vi之类的用起来会有点怪
c程序有了,我们还缺gcc编译器。alpine的包管理命令是apk,安装gcc
apk add gcc
不过alpine默认的安装源慢得要命,装个gcc都要好久。可以手动修改repositories,改为国内源
echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.8/main" > /etc/apk/repositories
echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.8/community" >> /etc/apk/repositories
不过一编译就报错了,很无语
1.c:1:19: fatal error: stdio.h: No such file or directory
在alpine之中,libc是要单独安装的
apk add libc-dev
安装完libc后,gcc终于可以顺利编译,hello world也顺利出现了