在csdn里写过相关的配置文章,可以查看:
如果是博客这样的网站应用,可以用dockerfile直接制作镜像(相关操作比较少且简单)。例如,创建网站docker镜像可以先构建jar包
./mvnw clean package
然后写一个如下的dockerfile:
# 使用官方轻量 JDK 镜像
FROM openjdk:17-jdk-alpine
# 创建工作目录
WORKDIR /app
# 复制 jar 文件
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar
# 默认执行命令
ENTRYPOINT ["java", "-jar", "app.jar"]
最后用docker build构建docker镜像环境,docker run运行
sudo docker build -t my_website . //对文件夹里的所有文件完成docker镜像构建,my_website是构建镜像的名字
docker run -d -p 8080:8080 --name java_web my_website
如果是ubuntu desktop这种操作系统镜像,则麻烦很多,需要先创建dockerfile
# Use an official Ubuntu runtime as a parent image
FROM ubuntu:latest
# Install desktop environment and VNC server
RUN apt-get update && apt-get install -y \
ubuntu-desktop \
x11vnc \
xfce4 \
supervisor \
&& rm -rf /var/lib/apt/lists/*
# Set environment variables
ENV VNC_PW 123456
ENV DISK_SIZE "50G"
ENV RAM_SIZE "4G"
ENV CPU_CORES "4"
# Configure VNC server
RUN mkdir -p /root/.vnc
RUN x11vnc -storepasswd $VNC_PW /root/.vnc/passwd
# Configure supervisor to start VNC server
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# Expose VNC port
EXPOSE 6080
# Start supervisor
CMD ["/usr/bin/supervisord"]
除此之外,也需要提供可用的supervisord.conf文件,我这里没有可用的conf文件,发现构建镜像是不报错的,但是docker run运行容器发现容器刚开启就关闭了,这个地方要多注意。
用docker build构建docker镜像环境,docker run运行
sudo docker build -t my_ubuntu . //给构建的镜像命名为 my_ubuntu,最好还是有名称
sudo docker build . //但也可以直接构建,这样只有id,需要后续为镜像命名
docker run --name ubuntu2 my_ubuntu //构建容器并命名
相比之下,docker compose更适合构建系统镜像 如果要构建ubuntu desktop,只需要
version: "3"
services:
ubuntu:
image: colinchang/ubuntu-desktop
container_name: ubuntu_desktop
shm_size: 1g
ports:
- "127.0.0.1:6901:6901"
environment:
RAM_SIZE: 4G
CPU_CORES: 2
DISK_SIZE: 80G
VNC_PW: 123456
user: root
restart: always
然后运行
sudo docker compose -f docker-compose-linux.yml up
但是这种方式属于下载别人已经构建好的镜像,安装到自己的容器内运行。你会发现用户名无法被改变,一直是kasm_user,即使加入VNC_USER也无济于事。实际用下来,开机也会同时打开ubuntu容器,不用的时候需要docker stop手动关闭。 所以如果对自己的镜像有要求,希望能比较全面的自定义镜像,可以用dockerfile,先构建后运行。 就需求而言,如果只是想在系统镜像里运行一些底层系统里没有,或者很难运行的程序或软件,(比如说ROS2,对ubuntu的适配很好,对其他的linux系统适配很差),则完全没必要使用dockerfile,直接docker compose就好了。
要构建win镜像,肯定首选docker compose,构建单个windows系统的话只需要一个docker-compose-win文件,对很多端口什么的也不需要加以区分,但是如果创建多个win镜像,则需要防止新的win容器覆盖旧的win容器,所需要注意的内容就变得很多。
docker-compose-win文件:
version: "3"
services:
windows:
image: dockurr/windows
container_name: windows
devices:
- /dev/kvm
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
stop_grace_period: 2m
restart: on-failure
environment:
VERSION: win10
RAM_SIZE: 20G
CPU_CORES: 4
DISK_SIZE: 100G
docker-compose-winagain文件:
version: "3"
services:
windows-harmony: #服务名称要改
image: dockurr/windows
container_name: windows_again #容器名称要改
devices:
- /dev/kvm
cap_add:
- NET_ADMIN
ports:
- 5800:8006 #端口固定是8006,可以代理端口到5800,和第一个docker win镜像加以区分
- 3387:3387/tcp #这俩端口也改
- 3387:3387/udp
stop_grace_period: 2m
restart: on-failure
environment:
VERSION: win10
RAM_SIZE: 16G
CPU_CORES: 4
DISK_SIZE: 100G
最后可以通过
docker image ls
docker ps -a
看一下目前电脑上已有的docker镜像和docker容器:
可以发现,有一个镜像是未命名状态,这是上午运行sudo docker build .形成的ubuntu-desktop镜像。运行docker tag命令完成对此镜像的命名:
docker tag 镜像id REPOSITORY:TAG
如果要删除容器和镜像,可以:
sudo docker image rm 镜像id
sudo docker rm 容器id