Docker是如何实现的?

1、去GitHub上查看docker-library

在这里插入图片描述

2、点击进入在这里插入图片描述

3.进入MySQL中发现其中有一个DockerFile文件
在这里插入图片描述
由此可见Image是由DockerFile文件生成的。

从DockerFile生成Image镜像

1,进入DockerHub中,找到MySQL,进入5.7版本中的DockerFile镜像
在这里插入图片描述
2,在CentOS中创建mysql-image文件夹,然后进入文件夹,创建Dockerfile文件
在这里插入图片描述
3,将官网的文件复制到DockerFile
在这里插入图片描述
4, 从DockerFile生成Image文件

docker build -t my-mysql-image .

在这里插入图片描述

MySQL中Dockerfile的命令解析

#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
基础镜像信息是FROM
FROM debian:buster-slim

# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
 镜像操作指令 RUN 构建镜像时执行的命令
RUN groupadd -r mysql && useradd -r -g mysql mysql

 镜像操作指令 RUN 构建镜像时执行的命令
RUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/*

# add gosu for easy step-down from root
# https://github.com/tianon/gosu/releases
设置环境变量 ENV
ENV GOSU_VERSION 1.12
RUN set -eux; \
	savedAptMark="$(apt-mark showmanual)"; \
	apt-get update; \
	apt-get install -y --no-install-recommends ca-certificates wget; \
	rm -rf /var/lib/apt/lists/*; \
	dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
	wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \
	wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \
	export GNUPGHOME="$(mktemp -d)"; \
	gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
	gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
	gpgconf --kill all; \
	rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
	apt-mark auto '.*' > /dev/null; \
	[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
	apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
	chmod +x /usr/local/bin/gosu; \
	gosu --version; \
	gosu nobody true

RUN mkdir /docker-entrypoint-initdb.d

RUN apt-get update && apt-get install -y --no-install-recommends \
# for MYSQL_RANDOM_ROOT_PASSWORD
		pwgen \
# for mysql_ssl_rsa_setup
		openssl \
# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
# File::Basename
# File::Copy
# Sys::Hostname
# Data::Dumper
		perl \
# install "xz-utils" for .sql.xz docker-entrypoint-initdb.d files
		xz-utils \
	&& rm -rf /var/lib/apt/lists/*

RUN set -ex; \
# gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported
	key='A4A9406876FCBD3C456770C88C718D3B5072E1F5'; \
	export GNUPGHOME="$(mktemp -d)"; \
	gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \
	gpg --batch --export "$key" > /etc/apt/trusted.gpg.d/mysql.gpg; \
	gpgconf --kill all; \
	rm -rf "$GNUPGHOME"; \
	apt-key list > /dev/null

ENV MYSQL_MAJOR 5.7
ENV MYSQL_VERSION 5.7.34-1debian10

RUN echo 'deb http://repo.mysql.com/apt/debian/ buster mysql-5.7' > /etc/apt/sources.list.d/mysql.list

# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
# also, we set debconf keys to make APT a little quieter
RUN { \
		echo mysql-community-server mysql-community-server/data-dir select ''; \
		echo mysql-community-server mysql-community-server/root-pass password ''; \
		echo mysql-community-server mysql-community-server/re-root-pass password ''; \
		echo mysql-community-server mysql-community-server/remove-test-db select false; \
	} | debconf-set-selections \
	&& apt-get update \
	&& apt-get install -y \
		mysql-server="${MYSQL_VERSION}" \
# comment out a few problematic configuration values
	&& find /etc/mysql/ -name '*.cnf' -print0 \
		| xargs -0 grep -lZE '^(bind-address|log)' \
		| xargs -rt -0 sed -Ei 's/^(bind-address|log)/#&/' \
# don't reverse lookup hostnames, they are usually another container
	&& echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnf \
	&& rm -rf /var/lib/apt/lists/* \
	&& rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \
	&& chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \
# ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime
	&& chmod 1777 /var/run/mysqld /var/lib/mysql

/*注释 VOLUME:添加卷,用于指定持久化目录 */
VOLUME /var/lib/mysql

/* ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget */
/* COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源,即将物理资源拷贝到容器中 */
COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
/*注释:ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。*/
ENTRYPOINT ["docker-entrypoint.sh"]

/*注释,EXPOSE:指定暴露镜像的端口供主机做映射*/
EXPOSE 3306 33060
/* CMD:构建容器后调用,也就是在容器启动时才进行调用,存在多个CMD时只有最后一个生效,也支持exec语法。 */
CMD ["mysqld"]

自定义Image镜像,将Spring boot项目打包成Image镜像

  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"
  2. 在docker环境中新建一个目录"first-dockerfile"
  3. 上传"dockerfile-demo-0.0.1-SNAPSHOT.jar"到该目录下,并且在此目录创建Dockerfile
  4. 创建Dockerfile文件,编写内容
FROM openjdk:8
MAINTAINER itcrazy2016
LABEL name="HelloDocker-Ysy" version="1.0" author="yueshaoyang"
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
  1. 还可以再次启动一个
docker run -d --name user02 -p 8081:8080 test-docker-image

Docker中仓库的分类

1.官方:hub.docker.com
2.阿里云:regs
3.自己的仓库,局域网,云服务器

将Image文件传到官方DockerHub仓库

Docker pull Tomcat 命令

docker pull  Tomcat 

其默认从DockerHub中获取相关的数据
那么我们想要把本地的Image传输到网络上,首先必须有一个DockerHub的官方账号
1、首先登录官方的账号
在这里插入图片描述
2、进入主页会发现已经运行的Image
在这里插入图片描述
3.当官网登录了DockerHub的账户后,使用docker login进行登录,需要登录用户名和密码
在这里插入图片描述

4,直接使用docker push 镜像名称 会出现问题

docker push test-docker-image 

在这里插入图片描述
报了denied: requested access to the resource is denied异常;需要使用 docker tag改名字。

5.首先使用docker tag命令将Docker 修改名称,然后再上传

docker tag test-docker-image itcrazy2018/test-docker-image:v1.0
docker push itcrazy2018/test-docker-image:v1.0

在这里插入图片描述

6,如果网络比较好的话,能够直接push成功。
在这里插入图片描述
7.从远端拉取

docker pull itcrazy2018/test-docker-image:v1.0

将Image传到阿里云镜像

1,在阿里云账号可以创建 镜像仓库和命名空间
在这里插入图片描述
2.在Centos中登录阿里云账号

sudo docker login --username=itcrazy2016@163.com registry.cn-hangzhou.aliyus.com

在这里插入图片描述

docker tag test-docker-image registry.cn-hangzhou.aliyuncs.com/itcrazy2016/test-docker-image:v1.0

在这里插入图片描述

sudo docker push registry.cn-hangzhou.aliyuncs.com/itcrazy2016/test-dockerimage:v1.0

在这里插入图片描述

总体流程总结

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

Harbor搭建私有的镜像服务器

1、搜索harbor,然后下载相关版本进行镜像私服的搭建
在这里插入图片描述
2,如果不想安装,可以点击Live Demo体验在线的感觉
在这里插入图片描述
3.在线的harbor镜像
在这里插入图片描述
4、输入默认的用户名和密码:
用户名:admin
密码:Harbor12345

在这里插入图片描述
5.首先我们将harbor-1.7.1的文件放到Docker上
在这里插入图片描述

6、接着对harbor文件进行解压

tar -zxvf harbor-offline-installer-v1.7.1.tgz

在这里插入图片描述
在这里插入图片描述
解压之后的情况
在这里插入图片描述
修改配置文件

vi harbor.cfg

在这里插入图片描述
在这里插入图片描述

df -h

df命令用于显示硬盘当前的使用情况
在这里插入图片描述
修改完配置文件之后,就开始启动,

在这里插入图片描述
使用docker vesion来查看版本
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来运行sh install.sh命令

在这里插入图片描述
harbor安装成功
在这里插入图片描述
访问对应的IP即可在浏览器得到相关的页面
在这里插入图片描述

(1)访问github上的harbor项目
咕泡学院 只为更好地你2.1.5 Image常见操作
2.2 深入探讨Container
既然container是由image运行起来的,那么是否可以理解为container和image有某种关系?
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,输入用户名和密码即可

使用Container生成Image 实践

在这里插入图片描述
在Linux中,Image Layer是只读的,而Container Layer既支持读,又支持写。
在这里插入图片描述

Image生成有两种方式,
方式一:使用Dockerfile【推荐】,因为可以看到执行过程
方式二:使用Container反编译生成Image 【不推荐,因为不可以看到执行过程】

在这里插入图片描述
Demo:拉取Centos,生成Container,然后进入Container中安装vim,接着将其打包成镜像,接着pull镜像,运行,看是否能够执行vim命令,如果,可以说明容器执行成功。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

container资源限制

1、使用docker top查看Tomcat占用的系统资源

docker top tomcat01

在这里插入图片描述

2、docker stats命令查看,能够看到占用的内存等信息
在这里插入图片描述
在这里插入图片描述

3、新启动一个容器,设置Memory,同时设置CPU的权重。
在这里插入图片描述
4、查看Tomcat02容器

docker stats tomcat02

在这里插入图片描述
5、查看Tomcat02的日志

docker logs tomcat02

在这里插入图片描述

图形化资源监控

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
首先第一步下载、安装、启动:
在这里插入图片描述
完成之后,启动成功
在这里插入图片描述
访问地址后,就可以看到对应的管理页面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

sudo curl -L git.io/scope -o /usr/local/bin/scope
sudo chmod a+x /usr/local/bin/scope
scope launch

Container中也存在Linux的原因

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

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

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐