一、什么是Image
- image是由一层层的layer构成
image是read-only - 看看官方提供tomcat的image
- image就是一个Dockerfile,分析一下Dockerfile的语法
FROM: 指定基础镜像(centos、 openjdk:8 等等)
eg:FROM openjdk:8-jdk
ENV:环境变量(可以通过docker run --e key=value修改)
eg:ENV CATALINA_HOME /usr/local/tomcat
RUN:container中执行命令(比如安装软件,配置环境等,换行可以使用"")
eg:RUN set -e \
&& nativeLines="$(catalina.sh configtest 2>&1)" \
&& nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')" \
&& nativeLines="$(echo "$nativeLines" | sort -u)" \
&& if ! echo "$nativeLines" | grep 'INFO: Loaded APR based Apache Tomcat Native library' >&2; then \
echo >&2 "$nativeLines"; \
exit 1; \
fi
LABEL:标签(设置标签名、版本号、作者、邮箱)
eg:LABEL name="Tomcat" version="v1.0" author="xxx" email="xxxxx@163.com"
VOLUME:文件挂载(数据存放目录)
eg:VOLUME /var/lib/mysql
COPY:将主机文件复制到容器中(单纯复制,不会解压)
eg:COPY demo-spring.jar /usr/local/demo
ADD: 类似COPY(会解压)
eg: ADD demo-spring.jar /usr/local/demo
WORKDIR:指定镜像的工作目录,之后的命令都是基于此目录工作,若不存在则创建
eg:
WORKDIR /root
ADD app.yml test/ (app.yml会被复制到/root/test下)
CMD:容器启动的时候执行的命令(如果有多个,只有最后一个生效)
eg:CMD ["java", "-jar", "demo-spring.jar"]
ENTRYPOINT: 和CMD类似(执行docker run 时 CMD命令会被覆盖而 ENTRYPOINT不会)
eg:ENTRYPOINT ["java", "-jar", "demo-spring.jar"]
EXPOSE:暴露镜像的端口 可以用-p指定
eg:EXPOSE 3306 33060 (默认容器3306 映射主机33060)
- 自定义Dockerfile
创建个Hello world的SpringBoot项目
mvn:package得到demo-spring.jar
mkdir /dockerfile/demo
rz demo-spring.jar
vim Dockerfile (内容如下)
FROM openjdk:8
LABEL name="demo-spring" version="1.0" author="wfq"
COPY demo-spring.jar demo-spring.jar
ENTRYPOINT ["java","-jar","demo-spring.jar"]
- 构建自定义的Dockerfile
//build( "."当前目录下构建)
docker build -t my-demo .
//启动容器
docker run -d --name=my-demo-spring -p 9527:9527 my-demo
//查询启动日志
docker logs my-demo-spring
//访问
curl localhost:9527/hellodocker
"路人是妖怪"
-
镜像仓库
官方的:hub.docker.com
登录:docker login
username:你申请的账号
password:你的密码
上传操作:
必须将你的镜像改名为 “你docker账号的id”/镜像名 eg: neo0116/my-demo
docker tag my-demo neo0116/my-demo
删除原来的镜像
docker rmi my-demo
上传
docker push neo0116/my-demo
阿里镜像仓库:https://cr.console.aliyun.com/cn-shenzhen/instances
先在阿里云上选择你仓库所在区域并创建命名空间
登录:sudo docker login --username=648931255@qq.com registry.cn-shenzhen.aliyuncs.com
password:密码上传操作:
必须将你的镜像改名为:“区域地址” / “你阿里云的命名空间” / 镜像名
eg:registry.cn-shenzhen.aliyuncs.com/aliyun_neo/my-demo
docker tag my-demo registry.cn-shenzhen.aliyuncs.com/aliyun_neo/my-demo:v1.0
删除原来的镜像
docker rmi my-demo
上传
docker push registry.cn-shenzhen.aliyuncs.com/aliyun_neo/my-demo:v1.0
拉取
docker pull registry.cn-shenzhen.aliyuncs.com/aliyun_neo/my-demo:v1.0
自建私服
工具harbor
:https://github.com/goharbor/harbor
1、下载:https://github.com/goharbor/harbor/releases
2、harbor要有docker-compose才能安装
3、docker-compose安装//运行以下命令以下载Docker Compose的当前稳定版本 sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker- compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose //将可执行权限应用于二进制文件 sudo chmod +x /usr/local/bin/docker-compose //测试安装 docker-compose --version
4、解压harbor.tar.gz
5、修改harbor.cfg文件:
主要是ip地址的修改成当前机器的ip地址
同时也可以看到Harbor的密码,默认是Harbor12345
6、安装:sh install.sh
7、浏览器直接访问 你的IP地址默认80端口,账号admin 密码Harbor12345
8、登录:docker login --username=admin
<harbor的IP地址>
password:Harbor12345
(如果报错:Error response from daemon: Get https://xxxx.xxx.xxx.xxx/v2/: dial tcp xxxx.xxx.xxx.xxx:443: connect: connection refused
(1)find / -name docker.service -type f
(2)在ExecStart 后 加上--insecure-registry=你的ip
(3)重启systemctl daemon-reload
systemctl restart docker
)
9、上传操作:
必须将你的镜像改名为:“你的项目名” / 镜像名
eg:neo/my-demo
docker tag my-demo neo/my-demo
10、删除原来的镜像
docker rmi my-demo
11、上传
docker push neo/my-demo
12、拉取
docker pull neo/my-demo
二、什么是Container
-
run一个image生成一个container
加锁部分就是image,未上锁就是container,也就是基于layer由image创建出来并且可读写 -
由container生成一个定制化的image
//拉取centos
docker pull centos
//交互式生成容器
docker run -d -it --name=my-centos centos
//进入容器
docker exec -it my-centos bash
//此时进入容器内部linux系统
sudo vim (发现没有vim命令)
yum install vim -y (安装vim)
sudo vim (已经有vim命令了)
exit
//回到主机上
//生成定制的image
docker commit my-centos custom-centos
docker run -d -it --name=my-custom-centos custom-centos
docker exec -it my-custom-centos bash
//进入容器的linux中
sudo vim (vim命令存在)
官方推荐使用Dockerfile生成image,出问题方便查询
- 容器指定占用资源
//--memory=500M限制最大内存500M
//--cpu-shares=10限制cpu最大权重10
docker run -d --name=tomcat01 --memory=500M --cpu-shares=10 -p 8080:8080 tomcat
- 底层技术
docker基于linux kernel 的NameSpace 隔离进程/网络/挂载点,CGroups(controller groups)限制资源(cpu/memory),UnionFileSystem用来给image和container分层