docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b3b46e8208d3 registry.cn-hangzhou.aliyuncs.com/shuodao/tomcat-8.5.27 "/bin/sh -c '/usr/to…" 9 seconds ago Up 7 seconds 0.0.0.0:80->8080/tcp relaxed_noyce
a 创建文件夹Docker
mkdir Docker
b 创建Dockerfile文件
vi Dockerfile
c 编辑文件并写入
#该镜像的父镜像 为 tomcat 镜像 这样我们就有了tomcat的环境
from registry.cn-hangzhou.aliyuncs.com/shuodao/tomcat-8.5.27
#复制当前文件夹下的 war包 到镜像中tomcat的webapps目录
COPY TestDocker.war /usr/tomcat/webapps
#去除容器内部中文乱码问题
ENV LANG C.UTF-8
d 下载测试包
testDocker.war
e 构建镜像
docker build -t 镜像名称(镜像名称必须为小写):镜像版本 .
docker build -t docker-test:latest .
f 查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-test latest e12f103326ee About a minute ago 386MB
hello-world latest bf756fb1ae65 7 months ago 13.3kB
registry.cn-hangzhou.aliyuncs.com/shuodao/tomcat-8.5.27 latest d07ca8aba782 2 years ago 369MB
g 运行构建的镜像
docker run -d -p 80:8080 docker-test
ed996d2bba530c406a74b401d7e7a8afe5feaf6f273bdafaf67ca50407e721ee
14 搜索镜像
docker search debian
15 常用指令
a FROM
用于指定基础images,格式为FROM OR FROM:
Dockerfile都应该以FROM开头,指明以什么images为基础
可以在同一个Dockerfile中多次使用FROM命令用于创建多个镜像
b MAINTAINER
用于指定镜像创建者和联系方式
c COPY
用于复制本地主机内容到容器中
d WORKDIR
用于配合RUN,CMD,ENTRYPOINT 命令设置当前工作路径
可以设置多次,如果是相对路径,则相对前一个WORKDIR命令,
默认路径为/
e RUN
用于容器内部执行命令,每个RUN命令相当于在原有的镜像基础上添加了一个改动层。
原有的镜像不会有变化,例如安装python依赖包,命令为:RUN pip install -r requirements.txt
f EXPOSE
用来指定对外开放的接口,EXPOSE 5000
g ENTRYPOINT
使容器表现的像一个可执行程序一样。一个Dockerfile中只能有一个改命令,如有多个,最后一个生效
h CMD
启动容器时默认执行的命令,该命令可以包含可执行文件,也可以不包含可执行文件
不包含可执行文件时要用ENTRYPOINT指定一个,然后CMD命令的参数就会作为ENTRYPOINT的参数
i ENV
用于在镜像构建过程中设置环境变量
j ADD
用来将构建环境下的文件和目录复制到镜像中
k LABEL
用于为Docker镜像添加元数据
16 获取容器日志信息
docker logs container
17 进入容器
docker attach container
18 在容器中执行命令
docker exec containre command
19 导出镜像
docker save -o image_name.tar image_name
20 Docker镜像中的base镜像理解
a 不依赖其他镜像,从scratch构建
b 其他镜像可以为之基础进行扩展的
c Linux操作系统由内核空间和用户空间组成
d 内核空间是kernel,Linux刚启动时加载bootfs文件系统给,之后会被卸载掉
e 用户空间的文件系统时rootfs,包含/dev ,/proc, /bin等目录
f 对于base镜像来说,底层直接用host的kernel,自己只需要提供rootfs就行了
g base镜像提供的是最小安装的linux发行版
h Dockerfile内容
FROM scratch
ADD centos-8-x86_64.tar.xz /
LABEL org.label-schema.schema-version="1.0" org.label-schema.name="CentOS Base Image" org.label-schema.vendor="CentOS" org.label-schema.license="GPLv2" org.label-schema.build-date="20200809"
CMD ["/bin/bash"]
i Dockerfile中ADD添加的镜像的tar包就是Centos 7的rootfs,在制作镜像时,该tar包会自动
解压到/目录下,生成/dev, /proc, /bin等目录
j base镜像只是在用户空间与发行版一致,kernel版本与发行版是不同的。例如 CentOS 7 使用 3.x.x 的 kernel,如果 Docker Host 是 Ubuntu 16.04(比如我们的实验环境),那么在 CentOS 容器中使用的实际是是 Host 4.x.x 的 kernel
k 容器只能使用 Host 的 kernel,并且不能修改。所有容器都共用 host 的 kernel,在容器中没办法对 kernel 升级。如果容器对 kernel 版本有要求(比如应用只能在某个 kernel 版本下运行),则不建议用容器,这种场景虚拟机可能更合适。
21 docker中制作自己的基础镜像 (未验证)
a 本地镜像
-把自己的开发环境打包,取名为centos6-base.tar,然后在docker中,以centos6-base.tar作为基础镜像
-创建自己的 镜像,放置于/root目录下
#tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos6-base.tar /
会生成打包文件centos6-base.tar文件
-将制作的centos导入,并命名为centos6-base
#cat centos6-base.tar | docker import - centos6-base
-现在可以运行它并测试查看内核
#docker run -i -t centos6-base cat /etc/redhat-release
b 本地目录
-假设把centos-base.tar放在/opt目录里
sudo tar -C . | docker import - /opt
c 远程镜像
sudo docker import http://example.com/exampleimage.tgz
docker save logmanager:1.0 > logmanager.tar or
docker save 131242bf3ee -o /root/dockerfile/my.tar
26 将tar包load成一个image
docker load < my.tar or
docker load -i my.tar
27 docker 容器镜像打包tar包-在现在的容器上保存镜像进行打包,在另一台服务上使用
a 命令:docker commit -a "dhd" -m "test" 8fd2108e1e90 hellp-world-test:v20200824
b 打包:docker save -o tmf-hello-world20200824.tar hellp-world-test:v20200824
c 部署升级:docker load -i tmf-hello-world20200824.tar
d 镜像打标签,目的是将导入的镜像归到某个镜像仓库里
docker tag tmp-web:v20200824 docker.oa.com:8080/tmf/tmf_web:v20200824
e 将镜像推送到仓库
docker push docker.oa.com:8080/tmf/tmf_web:v20200824