Docker容器部署使用和打包编译C程序
安装Docker并配置启动
yum源安装
yum install -y docker gcc
安装包安装
下载对应CPU架构的安装包:
https://download.docker.com/linux/static/stable/
# 上传并解压
tar -zxvf docker-<version>.tgz
# 将解压后的Docker可执行文件复制到系统的bin目录下
cp docker/* /usr/bin/
配置Docker服务
vi /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
镜像源配置
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.1ms.run","https://mirrors.ustc.edu.cn","http://mirrors.aliyun.com"]
}
文件授权,重新加载systemd配置文件并启动Docker服务
chmod +x /etc/systemd/system/docker.service
systemctl daemon-reload
systemctl start docker
systemctl enable docker
验证Docker服务是否启动成功
systemctl status docker
docker version
docker info
使用Docker打包和运行本地的C程序
准备一个C程序
vi hello.c
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
编译试运行
用gcc工具编译生成同名的可执行文件 hello 并尝试调用执行
gcc -o hello hello.c
./hello
创建Dockerfile
vi Dockerfile
# 使用一个基础镜像,这里选择gcc
FROM gcc:9.2.0
# 创建一个工作目录
WORKDIR /app
# 将本地编译好的可执行文件复制到镜像中,可执行文件与Dockerfile在同一目录下
COPY hello /app/hello
# 指定环境变量路径,有相关依赖用COPY拷进时需要指定
ENV LD_LIBRARY_PATH /app
# 设置容器启动时执行的命令
CMD ["./hello"]
构建Docker镜像
docker build -t hello_world_app .
-t hello_world_app是给镜像指定一个标签(tag)
. 表示使用当前目录下的Dockerfile
运行Docker容器
docker run --rm hello_world_app
–rm 选项表示在容器退出后自动删除容器
Docker 容器运维
# 查看容器镜像
docker images
# 查看运行中的容器/进程
docker ps
# 停止运行中的容器
docker stop 容器ID(IMAGE ID)
# 移除容器
docker rm 容器ID(IMAGE ID)
# 移除已停止的镜像
docker rmi 镜像ID
# -f 通过信号强制移除运行中的容器
docker rmi -f 镜像ID
# 进入容器
docker exec -it 容器名 bash
运行GCC容器
拉取镜像后,您可以通过以下命令运行一个GCC容器:
docker run -it gcc:9.2.0 /bin/bash
该命令将启动一个交互式的GCC容器,并进入bash环境。
挂载本地代码
如果您需要在宿主机上编辑代码并编译,可以使用Docker的卷(volume)功能将宿主机的代码目录挂载到容器中。以下命令将本地/path/to/code目录挂载到容器的/opt/code目录:
docker run -it -v /path/to/code:/opt/code gcc:9.2.0 /bin/bash
在容器中,您可以直接编辑/opt/code目录下的代码,并使用GCC编译器编译。
在odbc默认日志打印在/tmp目录下,容器运行完会自动清理,可采用该方法将日志保留在本地
构建新镜像
如果需要永久保存对容器内文件的更改,可以使用docker commit命令创建一个包含修改后的文件的新镜像
# 查看运行中的容器/进程
docker ps
# 构建新镜像
docker commit <container-id> <new-image-name>
镜像导出
如果您需要将GCC编译环境导出为镜像,可以使用以下命令:
docker run -it --name gcc_env gcc:9.2.0 /bin/bash
# ... 编译程序 ...
docker export gcc_env > gcc_env.tar
该命令将GCC编译环境导出为gcc_env.tar文件,您可以将其分发到其他机器。
加载镜像
docker load -i gcc_env.tar