天天看点

微服务运维专题 - Docker - 02 - Image and Container

Image and Container

  • 前言
  • Docker Image
    • Dockerfile
    • Dockerfile实战Spring Boot项目
    • 镜像仓库
      • docker hub
      • 阿里云docker hub
      • 搭建自己的Docker Harbor
    • Image常见操作
  • Docker Container
    • container到image
    • container资源限制
    • container常见操作
  • 底层技术支持
  • 写在最后

如今的互联网行情,作为Java开发人员,对于Docker + K8S 这两个技术点是必须掌握的,本专题就让我带领大家揭开Docker+K8S的神秘面纱,如果您还未曾了解过,那么也不要紧,只需跟着操作流程动手实验,用心思考,不论是面试,还是工作,想必定不会让各位失望~

在 Docker 篇 我们给到五个小节的内容加以阐述,分别是:

  • Docker - 01 - 初识Docker
  • Docker - 02 - Image and Container
  • Docker - 03 - Docker网络大揭秘
  • Docker - 04 - Docker数据持久化
  • Docker - 05 - Docker Compose 与 Docker Swarm
微服务运维专题 - Docker - 02 - Image and Container
image就是由一层一层的layer组成的。

官方image地址:

https://github.com/docker-library

Dockerfile文件中常见语法:

# 指定基础镜像,比如FROM ubuntu:14.04
FROM ubuntu:14.04
# 在镜像内部执行一些命令,比如安装软件,配置环境等,换行可以使用""
groupadd -r mysql && useradd -r -g mysql mysql
# 设置变量的值,ENV MYSQL_MAJOR 5.7,可以通过docker run --e key=value修改,后面可以直接使用${MYSQL_MAJOR}
ENV MYSQL_MAJOR 5.7
# 设置镜像标签
LABEL name="123"
# 指定数据的挂在目录
VOLUME /var/lib/mysql
# 将主机的文件复制到镜像内,如果目录不存在,会自动创建所需要的目录,注意只是复制,不会提取和解压
COPY docker-entrypoint.sh /usr/local/bin/
# 将主机的文件复制到镜像内,和COPY类似,只是ADD会对压缩文件提取和解压
ADD application.yml /etc/test/
# 指定镜像的工作目录,之后的命令都是基于此目录工作,若不存在则创建
WORKDIR tomcat
RUN touch test.txt
# 会在/usr/local/tomcat下创建test.txt文件
WORKDIR /root
ADD app.yml test/
# 容器启动的时候默认会执行的命令,若有多个CMD命令,则最后一个生效
CMD ["mysqld"]
# 和CMD的使用类似
ENTRYPOINT ["docker-entrypoint.sh"]
# 指定镜像要暴露的端口,启动镜像时,可以使用-p将该端口映射给宿主机
EXPOSE 3306
           

  1. 创建一个Spring Boot项目
  2. 写一个controller
@RestController
public class DockerController {
    @GetMapping("/dockerfile")
    @ResponseBody
    String dockerfile() {
        return "hello docker" ;
    }
}
           
  1. mvn clean package打成一个jar包

在target下找到"dockerfile-demo-0.0.1-SNAPSHOT.jar"

  1. 在docker环境中新建一个目录"first-dockerfile"
  2. 上传"dockerfile-demo-0.0.1-SNAPSHOT.jar"到该目录下,并且在此目录创建Dockerfile
  3. 创建Dockerfile文件,编写内容
FROM openjdk:8
MAINTAINER test
LABEL name="dockerfile-demo" 
version="1.0" 
author="test" 
COPY dockerfile-demo-0.0.1-SNAPSHOT.jar dockerfile-image.jar 
CMD ["java","-jar","dockerfile-image.jar"]
           
  1. 基于Dockerfile构建镜像
docker build -t test-docker-image .
           
  1. 基于image创建container
docker run -d --name user01 -p 6666:8080 test-docker-image
           
  1. 查看启动日志docker logs user01
  2. 宿主机上访问

    curl localhost:6666/dockerfile hello docker

  3. 还可以再次启动一个
docker run -d --name user02 -p 8081:8080 test-docker-image
           

通常有三种:

  • docker hub : docker 官方提供
  • 阿里云docker hub:阿里云提供
  • Docker Harbor:自定义

hub.docker.com

  1. 在docker机器上登录
docker login
           
微服务运维专题 - Docker - 02 - Image and Container
  1. 输入用户名和密码
  2. docker push test/test-docker-image [注意镜像名称要和docker id一致,不然push不成功]
  3. 给image重命名,并删除掉原来的
docker tag test-docker-image test/test-docker-image docker rmi -f test-docker-image
           
  1. 再次推送,刷新hub.docker.com后台,发现成功
  2. 别人下载,并且运行
docker pull test/test-docker-image

docker run -d --name user01 -p 6661:8080 test/test-docker-image
           

阿里云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 [email protected] registry.cn-hangzhou.aliyuncs.com
           
  1. 输入密码
  2. 创建命名空间,比如test
  3. 给image打tag
sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/test/test-docker-image:v1.0
           
  1. 推送镜像到docker阿里云仓库
sudo docker push registry.cn-hangzhou.aliyuncs.com/test/test-docker-image:v1.0
           
docker pull registry.cn-hangzhou.aliyuncs.com/test/test-docker-image:v1.0

docker run -d --name user01 -p 6661:8080 registry.cn-hangzhou.aliyuncs.com/test/test-docker-image:v1.0
           

  1. 访问github上的harbor项目

    https://github.com/goharbor/harbor

  2. 下载版本,比如1.7.1
https://github.com/goharbor/harbor/releases
           
  1. 找一台安装了docker-compose[这个后面的课程会讲解],上传并解压
tar -zxvf xxx.tar.gz
           
  1. 进入到harbor目录

修改harbor.cfg文件,主要是ip地址的修改成当前机器的ip地址同时也可以看到Harbor的密码,默认是Harbor12345

  1. 安装harbor,需要一些时间
sh install.sh
           

(6)浏览器访问,比如39.100.39.63,输入用户名和密码即可

  1. 查看本地image列表
docker images
           
微服务运维专题 - Docker - 02 - Image and Container
docker image ls
           
微服务运维专题 - Docker - 02 - Image and Container
  1. 获取远端镜像
docker pull
           
  1. 删除镜像[注意此镜像如果正在使用,或者有关联的镜像,则需要先处理完]
docker image rm imageid

docker rmi -f imageid
           

删除所有镜像

docker rmi -f $(docker image ls)
           
  1. 运行镜像
docker run image
           
  1. 发布镜像
docker push
           

既然container是由image运行起来的,那么是否可以理解为container和image有某种关系?

微服务运维专题 - Docker - 02 - Image and Container

其实可以理解为container只是基于image之后的layer而已,也就是可以通过docker run image 创建出一个container出来。

既然container是基于image之上的,想想是否能够由一个container反推出image呢?

肯定是可以的,比如通过docker run运行起一个container出来,这时候对container对一些修改,然后再生成一个新的image,这时候image的由来就不仅仅只能通过Dockerfile咯。
  1. 拉取一个centos image
docker pull centos
           
微服务运维专题 - Docker - 02 - Image and Container
  1. 根据centos镜像创建出一个container
docker run -d -it --name my-centos centos
           
微服务运维专题 - Docker - 02 - Image and Container
  1. 进入my-centos容器中
docker exec -it my-centos bash
           
微服务运维专题 - Docker - 02 - Image and Container
  1. 输入vim命令
vim
           
微服务运维专题 - Docker - 02 - Image and Container
  1. 现在对该container进行修改,也就是安装一下vim命令,然后将其生成一个新的centos
  2. 在centos的container中安装vim
yum install -y vim
           
微服务运维专题 - Docker - 02 - Image and Container
  1. 退出容器,将其生成一个新的centos,名称为"vim-centos-image"
docker commit my-centos vim-centos-image
           
微服务运维专题 - Docker - 02 - Image and Container
  1. 查看镜像列表,并且基于"vim-centos-image"创建新的容器
docker run -d -it --name my-vim-centos vim-centos-image
           
微服务运维专题 - Docker - 02 - Image and Container
  1. 进入到my-vim-centos容器中,检查vim命令是否存在
docker exec -it my-vim-centos bash
           
微服务运维专题 - Docker - 02 - Image and Container

可以通过docker commit命令基于一个container重新生成一个image,但是一般得到image的方式不建议这么做,不然image怎么来的就全然不知咯。

如果不对container的资源做限制,它就会无限制地使用物理机的资源,这样显然是不合适的。查看资源情况 :

docker stats

内存限制

Memory limit

--memory	
           

如果不设置 --memory-swap,其大小和memory一样

docker run -d --memory 100M --name tomcat1 tomcat
           

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 localhost
           
# 停止scope

scope stop

# 同时监控两台机器,在两台机器中分别执行如下命令

scope launch ip1 ip2
           

  1. 根据镜像创建容器
docker run -d --name -p 9090:8080 my-tomcat tomcat
           
  1. 查看运行中的container
docker ps
           
微服务运维专题 - Docker - 02 - Image and Container
  1. 查看所有的container[包含退出的]

docker ps -a

微服务运维专题 - Docker - 02 - Image and Container
  1. 删除container
docker rm containerid
           
微服务运维专题 - Docker - 02 - Image and Container

删除所有container

docker rm -f $(docker ps -a)
           
  1. 进入到一个container中
docker exec -it container bash
           
  1. 根据container生成image
docker commit
           
  1. 查看某个container的日志
docker logs container
           
  1. 查看容器资源使用情况
docker stats
           
  1. 查看容器详情信息
docker inspect container
           
  1. 停止/启动容器
docker stop/start container
           

Container是一种轻量级的虚拟化技术,不用模拟硬件创建虚拟机。

Namespace:用来做隔离的,比如pid[进程]、net[网络]、mnt[挂载点]等
CGroups: Controller Groups用来做资源限制,比如内存和CPU等
Union file systems:用来做image和container分层
           
上一篇: countDownLatch
下一篇: 原子操作