云原生docker1

docker

Modernize your applications, accelerate innovation
Securely build, share and run modern applications anywhere.
Docker is a platform for developers and sysadmins to develop, deploy, and
run applications with containers. The use of Linux containers to deploy
applications is called containerization. Containers are not new, but their
use for easily deploying applications is.
发现还是比较容易理解的,但是这里有一句“Containers are not new”,也就是容器化技术很早就 出现了,比如常见的容器化技术有OpenVZ,LXC,RKT等
在这里插入图片描述

docker的优势

(1)有助于Microservices的落地和部署
(2)充分利用物理机资源,同时能够整合服务器资源
(3)提高开发效率,测试效率,部署效率,有利于DevOps的落地,CICD
(4)云原生落地,应用更好地迁移

What is Image?

A Docker container image is a lightweight, standalone, executable package
of software that includes everything needed to run an application: code,
runtime, system tools, system libraries and settings.
镜像其实就是一个模板,把代码、依赖、配置、环境都打包成1个镜像。

What is Container?

A container is a standard unit of software that packages up code and all
its dependencies so the application runs quickly and reliably from one
computing environment to another.
容器是镜像run后的实例。类似于java中class和对象的关系。

Relation between image and container

Container images become containers at runtime and in the case of Docker。
containers- images become containers when they run on Docker Engine.

 container is launched by running an image. An image is an executable
package that includes everything needed to run an application--the code, a runtime, libraries, environment variables, and configuration files.

A container is a runtime instance of an image--what the image becomes in
memory when executed (that is, an image with state, or a user process). You can see a list of your running containers with the command, docker ps, just as you would in Linux.

Containers and virtual machines

在这里插入图片描述

Docker Engine and Architecture

Docker Engine is a client-server application with these major components:
1、A server which is a type of long-running program called a daemon process (the dockerd command).
2、A REST API which specifies interfaces that programs can use to talk to the daemon and instruct it what to do.
3、A command line interface (CLI) client (the docker command)
在这里插入图片描述

Docker Architecture

Docker uses a client-server architecture. The Docker client talks to the Docker
daemon, which does the heavy lifting of building, running, and distributing your
Docker containers. The Docker client and daemon can run on the same system, or
you can connect a Docker client to a remote Docker daemon. The Docker client and daemon communicate using a REST API, over UNIX sockets or a network interface
在这里插入图片描述

简单先说一下命令咯

docker pull        拉取镜像到本地
docker run         根据某个镜像创建容器
-d                 让容器在后台运行,其实就是一个进程
--name             给容器指定一个名字
-p                 将容器的端口映射到宿主机的端口
docker exec -it    进入到某个容器中并交互式运行
docker rmi 	-f   删除image
docker rm	-f 	 删除container
docker ps		查看运行的container	
docker images 查看所有镜像
docker ps -a   查看曾经container运行过的历史

eg:
1、创建Tomcat容器

docker pull tomcat
docker run -d --name my-tomcat -p 9090:8080 tomcat

2、创建mysql容器

docker run -d --name my-mysql -p 3301:3306 -e MYSQL_ROOT_PASSWORD=jack123 --privileged mysql

3、 进入到容器里面

docker exec -it containerid /bin/bash

4、退出容器

exit

5、删除container

docker rm -f tomcat01

6、删除image

docker rmi -f tomcat

Image and Container

在这里插入图片描述
我们在github上docker-library下载的镜像,究竟什么样?
可以看到mysql镜像,它底层依赖的linux环境和centos系统镜像,这些统统被打包到mysql镜像中了。这就是docker容器化技术,和vmware一样都属于虚拟化技术。

官方image

默认镜像仓库地址:
https://github.com/docker-library
mysql镜像地址
https://github.com/docker-library/tomcat/blob/master/8.5/jdk8/openjdk/Dockerfile

Dockerfile

制作一个自己的image镜像,顺便学习一下Dockerfile文件中常见语法。

FROM

指定基础镜像,比如FROM ubuntu:14.04

FROM ubuntu:14.04

RUN

在镜像内部执行一些命令,比如安装软件,配置环境等,换行可以使用""

RUN groupadd -r mysql && useradd -r -g mysql mysql

ENV

设置变量的值,ENV MYSQL_MA JOR 5.7,可以通过docker run --e key=value修改,后面可以直接使 用${MYSQL_MA JOR}

ENV MYSQL_MAJOR 5.7

LABEL

设置镜像标签

LABEL email="itcrazy2016@163.com"
LABEL name="itcrazy2016"

VOLUME

指定数据的挂在目录

指定数据的挂在目录

COPY

将主机的文件复制到镜像内,如果目录不存在,会自动创建所需要的目录,注意只是复制,不会提取和解压

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不会覆盖。

EXPOSE

指定镜像要暴露的端口,启动镜像时,可以使用-p将该端口映射给宿主机

EXPOSE 3306

Dockerfile实战Spring Boot项目

(1)创建一个Spring Boot项目
(2)写一个controller

@RestController
    public class DockerController {
        @GetMapping("/dockerfile")
        @ResponseBody
        String dockerfile() {
            return "hello docker" ;
        }
}

(3)mvn clean package打成一个jar包
在target下找到"dockerfile-demo-0.0.1-SNAPSHOT.jar"
(4)在docker环境中新建一个目录"first-dockerfile"
(5)上传"dockerfile-demo-0.0.1-SNAPSHOT.jar"到该目录下,并且在此目录创建Dockerfile
(6)创建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"]

(7)基于Dockerfile构建镜像

docker build -t test-docker-image .

(8)基于image创建container

docker run -d --name user01 -p 6666:8080 test-docker-image

(9)查看启动日志

docker logs user01

(10)宿主机上访问curl localhost:6666/dockerfile
hello docker
(11)还可以再次启动一个
docker run -d --name user02 -p 8081:8080 test-docker-image

镜像仓库docker hub

(1)在docker机器上登录 docker login
(2)输入用户名和密码
(3)docker push itcrazy2018/test-docker-image
[注意镜像名称要和docker id一致,不然push不成功]
(4)给image重命名,并删除掉原来的
docker tag test-docker-image itcrazy2018/test-docker-image docker rmi -f test-docker-image
(5)再次推送,刷新hub.docker.com后台,发现成功
(6)别人下载,并且运行
docker pull itcrazy2018/test-docker-image
docker run -d --name user01 -p 6661:8080 itcrazy2018/test-docker-image

阿里云docker hub

阿里云docker仓库
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories

(1)登录到阿里云docker仓库
sudo docker login --username=itcrazy2016@163.com registry.cn- hangzhou.aliyuncs.com
(2)输入密码 
(3)创建命名空间,比如itcrazy2016
(4)给image打tag
sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/itcrazy2016/test- docker-image:v1.0
(5)推送镜像到docker阿里云仓库
sudo docker push registry.cn-hangzhou.aliyuncs.com/itcrazy2016/test-docker- image:v1.0
(6)别人下载,并且运行
docker pull registry.cn-hangzhou.aliyuncs.com/itcrazy2016/test-docker-
image:v1.0
 docker run -d --name user01 -p 6661:8080 registry.cn-
hangzhou.aliyuncs.com/itcrazy2016/test-docker-image:v1.0

搭建自己的Docker Harbor

(1)访问github上的harbor项目
https://github.com/goharbor/harbor
(2)下载版本,比如1.7.1 https://github.com/goharbor/harbor/releases
(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.63,输入用户名和密码即可

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是由image运行起来的,那么是否可以理解为container和image有某种关系?
在这里插入图片描述

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

container到image

既然container是基于image之上的,想想是否能够由一个container反推出image呢?
肯定是可以的,比如通过docker run运行起一个container出来,这时候对container对一些修 改,然后再生成一个新的image,这时候image的由来就不仅仅只能通过Dockerfile。
eg:

(1)拉取一个centos image docker pull centos
(2)根据centos镜像创建出一个container
docker run -d -it --name my-centos centos
(3)进入my-centos容器中
docker exec -it my-centos bash
(4)输入vim命令
bash: vim: command not found
(5)我们要做的是 对该container进行修改,也就是安装一下vim命令,然后将其生成一个新的centos
(6)在centos的container中安装vim yum install -y vim
(7)退出容器,将其生成一个新的centos,名称为"vim-centos-image" 
docker commit my-centos vim-centos-image
(8)查看镜像列表,并且基于"vim-centos-image"创建新的容器
docker run -d -it --name my-vim-centos vim-centos-image
(9)进入到my-vim-centos容器中,检查vim命令是否存在 
docker exec -it my-vim-centos bash
vim

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

container资源限制

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

内存限制

–memory Memory limit
如果不设置 --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 39.100.39.63
# 停止
scope scope stop
# 同时监控两台机器,在两台机器中分别执行如下命令 
scope launch ip1 ip2

container常见操作

(1)根据镜像创建容器
docker run -d --name -p 9090:8080 my-tomcat tomcat
(2)查看运行中的container docker ps
(3)查看所有的container[包含退出的] docker ps -a
(4)删除container
docker rm containerid docker rm -f $(docker ps -a)
(5)进入到一个container中
docker exec -it container bash
(6)根据container生成image docker
(7)查看某个container的日志 docker logs container
(8)查看容器资源使用情况 docker stats
(9)查看容器详情信息
docker inspect container
(10)停止/启动容器
docker stop/start container

container底层技术支持

Container是一种轻量级的虚拟化技术,不用模拟硬件创建虚拟机。
Docker是基于Linux Kernel的Namespace、CGroups、UnionFileSystem等技术封装成的一种自定义容器格式,从而提供一套虚拟运行环境。

Namespace:用来做隔离的,比如pid[进程]、net[网络]、mnt[挂载点]CGroups: Controller Groups用来做资源限制,比如内存和CPU等 
Union file systems:用来做image和container分层
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值