一、镜像
Dockerfile常见语法
- FROM:指定基础镜像,比如FROM ubuntu:14.04
FROM ubuntu:14.04
- RUN:在镜像内部执行一些命令,比如安装软件,配置环境等,换行可以使用""
RUN groupadd -r mysql && useradd -r -g mysql mysql
- ENV:设置变量的值,ENV MYSQL_MAJOR 5.7,可以通过docker run --e key=value修改,后面可以直接使用${MYSQL_MAJOR}
ENV MYSQL_MAJOR 5.7
- LABEL:设置镜像标签
LABEL email="itcrazy2016@163.com"
LABEL name="itcrazy2016"
- VOLUME:指定数据的挂在目录
VOLUME /var/lib/mysql
- 将主机的文件复制到镜像内,如果目录不存在,会自动创建所需要的目录,注意只是复制,不会提取和解压
COPY docker-entrypoint.sh /usr/local/bin/
- ADD:将主机的文件复制到镜像内,和COPY类似,只是ADD会对压缩文件提取和解压
ADD application.yml /etc/itcrazy2016/
- WORKDIR:指定镜像的工作目录,之后的命令都是基于此目录工作,若不存在则创建
WORKDIR /usr/local
WORKDIR tomcat
RUN touch test.txt
会在/usr/local/tomcat下创建test.txt文件
WORKDIR /root
ADD app.yml test/
会在/root/test下多出一个app.yml文件
- CMD:容器启动的时候默认会执行的命令,若有多个CMD命令,则最后一个生效
CMD ["mysqld"] 或CMD mysqld
- ENTRYPOINT:和CMD的使用类似
ENTRYPOINT ["docker-entrypoint.sh"]
和CMD不同的是,docker run执行时,会覆盖CMD的命令,而ENTRYPOINT不会
11. EXPOSE:指定镜像要暴露的端口,启动镜像时,可以使用-p将该端口映射给宿主机
Dockerfile实战Spring Boot项目
- 创建一个spring boot项目
- 写一个controller
@RestController
public class DockerController {
@GetMapping("/dockerfile")
String dockerfile() {
return "hello docker" ;
}
}
- mvn clean package打成一个jar包。在target下找到"dockerfile-demo-0.0.1-SNAPSHOT.jar"
- 在docker环境中新建一个目录"first-dockerfile"
- 上传"dockerfile-demo-0.0.1-SNAPSHOT.jar"到该目录下,并且在此目录创建Dockerfile
- 创建Dockerfile文件,编写内容
FROM openjdk:8
MAINTAINER itcrazy2016
LABEL name="dockerfile-demo" version="1.0" author="itcrazy2016"
COPY dockerfile-demo-0.0.1-SNAPSHOT.jar dockerfile-image.jar
CMD ["java","-jar","dockerfile-image.jar"]
- 基于Dockerfile构建镜像
docker build -t test-docker-image .
- 基于image创建container
docker run -d --name user01 -p 6666:8080 test-docker-image
- 查看启动日志docker logs user01
- 宿主机上访问curl localhost:6666/dockerfile
镜像仓库
Docker hub: https://hub.docker.com/
(1) 在docker机器上登录
docker login
(2)输入用户名和密码
(3)docker push xxxx/test-docker-image
[注意镜像名称要和docker id一致,不然push不成功]
(4)给image重命名,并删除掉原来的
docker tag test-docker-image xxxx/test-docker-image
docker rmi -f test-docker-image
(5)再次推送,刷新hub.docker.com后台,发现成功
(6)别人下载,并且运行
docker pull ixxxx/test-docker-image
docker run -d --name user01 -p 6661:8080 xxxx/test-docker-image
阿里云docker hub
阿里云docker仓库
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
参考手册
https://cr.console.aliyun.com/repository/cn-hangzhou/dreamit/image-repo/details
(1)登录到阿里云docker仓库
sudo docker login --username=xxxx registry.cn- hangzhou.aliyuncs.com
(2)输入密码
(3)创建命名空间,比如xxxx
(4)给image打tag
sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/xxxx/test- docker-image:v1.0
(5)推送镜像到docker阿里云仓库
sudo docker push registry.cn-hangzhou.aliyuncs.com/xxxx/test-docker- image:v1.0
(6)别人下载,并且运行
docker pull registry.cn-hangzhou.aliyuncs.com/xxxx/test-docker- image:v1.0
docker run -d --name user01 -p 6661:8080 registry.cn- hangzhou.aliyuncs.com/xxxx/test-docker-image:v1.0
搭建自己的Docker Harbor
(1)访问github上的harbor项目 Harbor
(2)下载版本,比如1.7.1
(3)找一台安装了docker-compose的虚拟机,上传并解压
tar -zxvf xxx.tar.gz
(4)进入到harbor目录,修改harbor.cfg文件,主要是ip地址的修改成当前机器的ip地址 同时也可以看到Harbor的密码,默认是Harbor12345
(5)安装harbor,需要一些时间。
sh install.sh
(6)浏览器访问,比如39.100.39.61,输入用户名和密码即可
Image的常见操作
(1)查看本地image列表
docker images
docker image ls
(2)获取远端镜像
docker pull
(3)删除镜像[注意此镜像如果正在使用,或者有关联的镜像,则需要先处理完]
docker image rm imageid
docker rmi -f imageid
docker rmi -f $(docker image ls) 删除所有镜像
(4)运行镜像
docker run image
(5)发布镜像
docker push
容器(Container)
container常见操作
(1)根据镜像创建容器
docker run -d --name -p 9090:8080 my-tomcat tomcat
(2)查看运行中的container
docker ps
docker ps -a 查看所有的container[包含退出的]
(4)删除container
docker rm containerid
docker rm -f $(docker ps -a) 删除所有container
(5)进入到一个container中
docker exec -it container bash
(6)查看某个container的日志
docker logs container
(7)查看容器资源使用情况
docker stats
(8)查看容器详情信息
docker inspect container
(9)停止/启动容器
docker stop/start container
(10)内存限制
--memory Memory limit
如果不设置 --memory-swap,其大小和memory一样
docker run -d --memory 100M --name tomcat1 tomcat
(11)CPU限制
--cpu-shares 权重
docker run -d --cpu-shares 10 --name tomcat2 tomcat
图形化资源监控
https://github.com/weaveworks/scope
sudo curl -L git.io/scope -o /usr/local/bin/scope
sudo chmod a+x /usr/local/bin/scope
scope launch 39.100.39.63
停止scope
scope stop
同时监控两台机器,在两台机器中分别执行如下命令
scope launch ip1 ip2