docker
基于基础镜像构建自己的镜像
- 编写Dockerfile
指令 | 描述 |
---|---|
FROM | 构建的新镜像是基于哪个镜像。例如:FROM centos:6 |
MAINTAINER | 镜像维护者姓名或邮箱地址。例如:MAINTAINER Mr.chen |
RUN | 构建镜像时运行的Shell命令。例如:RUN [“yum”,“install”,“httpd”],或者RUN yum install httpd |
CMD | 运行容器时执行的Shell命令(可以被运行时传递的参数覆盖)。例如:CMD ["-c","/start.sh"], 或者CMD ["/usr/sbin/sshd","-D"]或者CMD /usr/sbin/sshd -D |
EXPOSE | 声明容器运行的服务端口。例如:EXPOSE 80 443 |
ENV | 设置容器内环境变量。例如:ENV MYSQL_ROOT_PASSWORD 123456 |
ADD | 拷贝文件或目录到镜像(可以自动解压缩或者下载) 例如:ADD [“src”,“dest”]或者ADD https://xxx.com/html.tar.gz/var/www/html, 或者:ADD html.tar.gz /var/www/html |
COPY | 拷贝文件或目录到镜像(不能自动解压缩)。例如:COPY ./start.sh /start.sh |
ENTRYPOINT | 运行容器时执行的Shell命令(不能被运行时传递的参数覆盖)。例如:ENTRYPOINT ["/bin/bash","-c","/start.sh"], 或者ENTRYPOINT /bin/bash -c “/start.sh” |
VOLUME | 指定容器挂载点到宿主机自动生成的目录或其他容器, 例如:VOLUME ["/var/lib/mysql"] |
USER | 为RUN,CMD和ENTRYPOINT执行命令指定运行用户, 例如:USER Mr_chen |
WORKDIR | 为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。 例如:WORKDIR /data |
HEALTHCHECK | 健康检查。例如:HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMD curl -f http://localhost/ |
ARG | 在构建镜像时指定一些参数。例如:ARG user |
# from为基础镜像
from centos
# 作者信息
MAINTAINER cheers0606 <cheers0606520@gmail.com>
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
# ENV LC_ALL en_US.UTF-8
ADD jdk-8u221-linux-x64.tar.gz /usr/local/
ADD apache-maven-3.6.1-bin.tar.gz /usr/local/
RUN ln -s /usr/local/jdk1.8.0_221 /usr/local/jdk
RUN ln -s /usr/local/apache-maven-3.6.1 /usr/local/maven
ADD settings.xml /usr/local/maven/conf/
# 放置源码
RUN mkdir /code
# ADD code /code
ENV JAVA_HOME /usr/local/jdk
ENV MVN_HOME /usr/local/maven
ENV path $path:${JAVA_HOME}/bin:${MVN_HOME}/bin
RUN echo 'starting build code'
RUN echo `ls /code/`
WORKDIR /code
# RUN ${MVN_HOME}/bin/mvn clean package -Dmaven.test.skip=true
RUN echo 'end'
- build镜像
# 注意,镜像名不能包含大写
docker build -f Dockerfile -t cheers0606/go_manager:v1.0 .
- 检查是否构建成功
[root@bogon buildGoManager]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cheers0606/go_manager v1.0 c382ed166a3b 22 minutes ago 637MB
centos latest 0f3e07c0138f 9 days ago 220MB
mysql latest b8fd9553f1f0 4 weeks ago 445MB
centos centos7.6.1810 f1cb7c7d58b7 7 months ago 202MB
elasticsearch 6.6.2 1bca39c5a102 7 months ago 842MB
- 打包镜像
docker save cheers0606/go_manager:v1.0 > go_manager.tar
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2GnU2cVd-1570859034622)(leanote://file/getImage?fileId=5da028809dd79a4695000000)]
- 加载镜像
打包完后的镜像可以发送给别人,然后直接加载镜像即可
docker load -i go_manager.tar
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zDa2CFlS-1570859034622)(leanote://file/getImage?fileId=5da122aa5644053514000002)]
- 运行镜像
# 运行并进入bash
# -v 为挂载本地路径,冒号前为物理机路径,冒号后为docker环境中的路径,最后的rw为权限,此处为读写
# -it : 目前的理解浅薄,就是要等在容器内的命令执行完毕才会出来到当前操作; 没有-it的加 就相当于在容器内执行一下命令,不等容器内部是否执行完毕直接出来,而我们看见的他在上面是因为容器内的执行快,(行动派可以试试在里面写个循环制造时间验证)
# --name docker名字
docker run -it -v /path/to/code:/code:rw --name=go_manager cheers0606/go_manager:v1.0 /bin/bash
# 运行但不进入bash
docker run -v /path/to/code:/code:rw cheers0606/go_manager:v1.0
# 进入正在运行的docker的bash。CONTAINER_ID可以通过docker ps 查看
docker exec -it CONTAINER_ID bash
- 打包正在运行的容器
#-a :提交的镜像作者;
#-c :使用Dockerfile指令来创建镜像;
#-m :提交时的说明文字;
#-p :在commit时,将容器暂停。
[root@bogon buildGoManager]# docker commit -a "cheers0606" -m "mvn docker" bfba3e1cd30c cheers/gomanager:1.0
sha256:b5d08f5dc7b7f019e6d01917d9a47e5c500043236487f8c54e5d428ba604a55f
[root@bogon buildGoManager]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cheers/gomanager 1.0 b5d08f5dc7b7 9 seconds ago 739MB
[root@bogon buildGoManager]# docker run -it --name cheers cheers/gomanager:1.0 /bin/bash
# 打包后会包含运行过程中产生的数据。如mvn下载的依赖
[root@ed0e68b82d6b code]# du -sh /usr/share/maven/repository
106M /usr/share/maven/repository
- 将打包好的镜像pull到私服
[root@master /]# docker load -i gomanager_wiht_dependencies.tar
9e607bb861a7: Loading layer [==================================================>] 227.4 MB/227.4 MB
da5c1636e6ff: Loading layer [==================================================>] 408 MB/408 MB
c08404f8c986: Loading layer [==================================================>] 10.77 MB/10.77 MB
4cb4dc4134a3: Loading layer [==================================================>] 2.56 kB/2.56 kB
eb5be439dd35: Loading layer [==================================================>] 2.56 kB/2.56 kB
de7789f89c75: Loading layer [==================================================>] 8.192 kB/8.192 kB
469518fbefb5: Loading layer [==================================================>] 2.048 kB/2.048 kB
8aa83b1359d0: Loading layer [==================================================>] 104.9 MB/104.9 MB
Loaded image: cheers/gomanager:1.0
[root@master /]# docker images|grep gomanager
cheers/gomanager 1.0 b5d08f5dc7b7 15 hours ago 739 MB
[root@master /]# docker tag cheers/gomanager:1.0 master:5000/cheers/gomanager:1.0
[root@master /]# docker push master:5000/cheers/gomanager:1.0
The push refers to a repository [master:5000/cheers/gomanager]
8aa83b1359d0: Pushed
469518fbefb5: Pushed
de7789f89c75: Pushed
eb5be439dd35: Pushed
4cb4dc4134a3: Pushed
c08404f8c986: Pushed
da5c1636e6ff: Pushed
9e607bb861a7: Pushed
1.0: digest: sha256:fa84bb455b7ca647343cf8065d14690baf91cc3d563c7669f3974e2f0a1b03c8 size: 1994
- docker prune 命令
prune 命令用来删除不再使用的 docker 对象。
# 删除所有未被 tag 标记和未被容器使用的镜像:
docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
# 删除所有未被容器使用的镜像:
docker image prune -a
# 删除所有停止运行的容器:
docker container prune
# 删除所有未被挂载的卷:
# docker volume prune
# 删除所有网络:
docker network prune
# 删除 docker 所有资源:
docker system prune
gomanager.tar镜像 编译gomanager
# 前提条件:可以连接公司的maven私服(192.168.0.65)
docker load -i gomanager.tar
docker run --name gomanager -it -v /path/to/code:/code:rw gosuncn/gomanager:v1.0 /bin/bash
${MVN_HOME}/bin/mvn clean package -Dmaven.test.skip=true
# 编译完成后,在/path/to/code/target中会生成相应的war包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5RbJ8Oj9-1570859034623)(leanote://file/getImage?fileId=5da046055644053514000000)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HcG8tlmu-1570859034623)(leanote://file/getImage?fileId=5da046255644053514000001)]