一、构建Docker镜像
# 构建容器
docker build -t 镜像名称 . # 后面的. 指的是当前文件夹 (其实是Dockerfile存放的文件夹) docker build --rm=true -t loen/lamp .
–rm 选项是告诉Docker,在构建完成后删除临时的Container,Dockerfile的某些指令(比如RUN、ADD、COPY)会创建临时的Container,这些临时生成的Container可以当做下次或者其他构建的缓存层,如果你确定不需要这些缓存,可以加上这个参数。
# 查看历史
docker history 镜像ID
# 格式化显示
docker history 镜像ID --format "table{{.ID}}=\n{{.CreatedBy}}" --no-trunc
二、Dockerfile最佳实践
参见我的这篇文章《Dockerfile最佳实践》
三、常见问题
1、解决Docker容器中文乱码问题:
执行如下命令即可:export LC_ALL=C.UTF-8
如果要制作Dockerfile,不能用export,环境变量要固化到镜像中,必须使用ENV:
ENV LC_ALL=C.UTF-8
或者另一种脚本方案:
echo 'export LC_ALL=C.UTF-8' >> /etc/profile
四、我的Dockerfile文件
例1、Tomcat快速测试版
# 源于tomcat官方镜像:https://hub.docker.com/_/tomcat FROM tomcat:8.5.47-jdk8-corretto #删除tomcat自带的app,然后设置正确的时区 RUN rm -rf /usr/local/tomcat/webapps/* \ && export TZ=Asia/Shanghai \ && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ && echo $TZ > /etc/timezone \ && unset TZ #将target下的xx.war拷贝到/usr/local/tomcat/webapps/下 COPY target/*.war /usr/local/tomcat/webapps
例2、安装nodejs 和 vue的开发运行环境,运行 vue serve,访问http://localhost:8080/,显示App.vue的内容。
参见这个例子:
https://cli.vuejs.org/guide/prototyping.html
构建步骤一:基于node的vue环境基础镜像
FROM node RUN npm install -g @vue/cli \ && npm install -g @vue/cli-service-global \ && mkdir /app CMD ["./usr/local/bin/vue", "--version"]
建议使用stdin构建(无需上下文):
docker build -t vue-serve:latest -<<EOF FROM node RUN npm install -g @vue/cli \ && npm install -g @vue/cli-service-global \ && mkdir /app CMD ["./usr/local/bin/vue", "--version"] EOF
构建步骤二:vue app onbuild基础镜像
FROM vue-serve WORKDIR /app COPY docker-entrypoint.sh /app/ ONBUILD COPY . /app/ ENTRYPOINT ["/app/docker-entrypoint.sh"]
docker build -t vue-onbuild:latest .
注意,给dock-entrypoint.sh添加可执行权限。chmod +x *.sh
构建步骤三:业务app镜像
FROM vue-onbuild
docker build -t vue-xxxx:latest .
注意,这个例子的是当做开发环境运行。如果是测试环境,需要先build出target文件,然后放到Nginx等Web服务器上运行。build过程,可以使用docker的多阶段构建,或者使用容器云平台的pipline流水线。
例3、Nginx应用镜像
如下:
FROM nginx:1.17.4 #用本地的文件替换nginx镜像里的默认配置 COPY nginx.conf /etc/nginx/nginx.conf #拷贝web文件到html目录 COPY dist/ /usr/share/nginx/html/
其中简单的nginx.conf如下:
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; # http server server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; #try_files $uri $uri/ /index.html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } }
例4、Fat Jar程序
Dockerfile如下:
# 源于亚马逊jdk官方镜像:https://hub.docker.com/_/amazoncorretto FROM amazoncorretto:8 ADD target/xxxxxxx.jar . EXPOSE 8080 # 环境变量 $JAVA_OPTS 在外部配置 ENTRYPOINT exec java $JAVA_OPTS -jar xxxxxxx.jar # 常用的有: # -Dfile.encoding=UTF8 # -Duser.timezone=GMT+08 # # -Xms256m -Xmx512m # -XX:+UseG1GC # -XX:MaxGCPauseMillis=200 # # -Djava.security.egd=file:/dev/./urandom #