Docker 一篇就够了

1.Docker简介

Docker是一个开源的应用容器引擎;是一个轻量级容器技术;

Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;

运行中的这个镜像称为容器,容器启动是非常快速的。
Docker主要是用来解决环境问题(例如开发和线上环境不一致问题)
Docker图片

2.核心概念

  1. docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);

  2. docker客户端(Client):连接docker主机进行操作;

  3. docker仓库(Registry):用来保存各种打包好的软件镜像;

  4. docker镜像(Images):软件打包好的镜像;放在docker仓库中;

  5. docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用
    Docker架构图
    使用Docker的步骤:

1)、安装Docker

2)、去Docker仓库找到这个软件对应的镜像;

3)、使用Docker运行这个镜像,这个镜像就会生成一个Docker容器;

4)、对容器的启动停止就是对软件的启动停止;

3.Docker 安装(基于centos7)

  1. 安装docker(前提机器能上网)
yum install -y docker
  1. 启动docker
systemctl start docker
  1. 设置开机启动(方便以后开机后后台进程能直接启动)
systemctl enable docker
  1. 停止docker
systemctl stop docker

注意:哪些想要在windows上直接安装的小伙伴们,劝你们早点收手把,直接linux安装把,别瞎瘠薄折腾了!!!

4.Docker常用命令&操作

4.1 镜像操作

操作命令说明
检索docker search 关键字 eg:docker search redis我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。
拉取docker pull 镜像名:tag:tag是可选的,tag表示标签,多为软件的版本,默认是latest
列表docker images查看所有本地镜像
删除docker rmi image-id删除指定的本地镜像
在这里插入图片描述

4.2 容器命令

操作命令说明
新建并启动容器docker run [OPTIONS] IMAGE [COMMAND] [ARG…]options有这些:
--name=“容器名” 为容器起个名
-d: 后台运行容器,并返回容器ID
-i:以交互模式运行容器,通常与 -t 同时使用
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用
-p: 指定端口映射 eg: -p 8080:8080
列出当前运行容器docker ps [OPTIONS]options说明:
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器.
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
--no-trunc :不截断输出。
退出容器两种方式exit: 容器停止并退出
ctrl + p + q 容器不停止退出
启动容器docker start 容器ID或者容器名
重启容器docker restart 容器ID或者容器名
停止容器docker stop 容器ID或者容器名
强制停止容器docker kill 容器ID或者容器名一次性删除多个 :
docker rm -f $(docker ps -a -q)
docker ps -a -q
删除已经停止的容器docker rm 容器ID
************下面的灰常重要***************************
启动守护式容器docker run -d 容器名
查看容器日志docker logs -f -t --tail 容器ID-t 是加入时间戳 br/<> -f 跟随最新的日志打印
--tail 数字 显示最后多少条
查看容器内运行的进程docker top 容器ID
查看容器内部细节docker inspect 容器ID
进入正在运行的容器并以命令行交互docker exec -it 容器ID bashShell
docker attach 容器ID
exec是在容器中打开新的终端,并且可以启动新的进程
attach 直接进入容器启动命令的终端,不会启动新的进程
从容器内拷贝文件到主机上docker cp 容器ID:容器内路径 目的主机路径

5. 数据共享

5.1 端口映射

容器内外是两个网络,要想通过外面的主机访问容器里面的端口需要做端口映射。例如容器里面启动了一个tomcat,需要访问8080端口,可是这个端口是容器内部的,所以想要访问就需要在外部也开一个端口进行映射,shell docker run -d -p 80:8080 tomcat
也可以使用大P ,大P是随机进行映射的。

5.2 磁盘挂载(数据卷)

有时候我们不熟环境,希望生成的数据能够保存起来,不能删除容器后数据就消失了,例如部署mysql,mysql的数据如果放在容器内,容器删除则数据就没了;部署redis的话 开启的aof,rdb这些数据也是希望能保存下来的,所以产生了磁盘挂在(说白点就是容器内一个或者多个文件夹和主机中的一个或多个文件进行数据共享,容器删除后,数据就留在了主机上,并不会删除)

#挂载磁盘
 docker run -it -v /宿主机绝对路径目录:/容器内目录  镜像名
 #查看是否挂载成功
 docker inspect 容器ID
 #只读挂载
 docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

6. 生成新镜像

6.1 基于容器创建新容器

启动一个容器,然后对容器进行操作,操作后的容器可以生成一个新的镜像

 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
 eg:    docker commit 77857578237d mytest:1.0

6.2 基于DockerFile创建新容器

DockerFile可以说是基于一个镜像进行对其一系列的操作生成新的镜像,DockerFile就是对这个镜像的一系列操作的描述。
基于DockerFile创建容器,主要分为三个步骤

  1. 编写DockerFile文件
  2. build 文件 build -f DockerFilePath -t imageName:tag
  3. run

下面介绍一些DockerFile的关键字(预留字)

关键字语法例子备注
FORMFROM [–platform=] [:] [AS ]eg: FROM scrtch都需要有个父镜像 base镜像是 scratch ,就像java中的Object一样
RUN两种语法
1:RUN
2: RUN [“executable”, “param1”, “param2”]
RUN yum -y install vim就是用来执行shell的
CMDCMD [“executable”,“param1”,“param2”]
CMD command param1 param2
CMD echo “This is a test.” | wc -
CMD [“/usr/bin/wc”,“–help”]
用来执行命令的,一个DockerFile只有一个,多个的话前面会被覆盖
LABELLABEL <key>=<value> <key>=<value> …LABEL “com.example.vendor”=“ACME Incorporated”
LABEL com.example.label-with-value=“foo”
LABEL version=“1.0”
LABEL description=“This text illustrates \
that label-values can span multiple lines.”
dockerFile的描述,可以写上邮箱作者版本什么的,,,
MAINTAINERMAINTAINER LABEL maintainer=“915619712@qq.com”主要是描述作者信息,跟LABEL 作用类似
EXPOSEEXPOSE [/…]EXPOSE 80/udp暴露端口,run的时候使用-p进行映射
ENVENV <key> <value>
ENV <key>=<value>
ENV myName=“John Doe”
ENV JAVA_HOME=/local/usr/jdk1.8
环境变量
ADDADD [–chown=:] … ADD hom* /mydir/从宿主机上拷贝文件到容器
如果是tar文件,则会自动解压
COPYCOPY [–chown=:] … COPY hom* /mydir/从宿主机上拷贝文件到容器,没有解压功能
ENTRYPOINTENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2
ENTRYPOINT exec top -b功能和cmd类似,但是cmd会被覆盖 而这个是追加
VOLUMEVOLUME [“/data”]VOLUME /myvol挂载卷(只能指定容器内的目录)
USERUSER [:]USER admin使用用户 默认root
WORKDIRWORKDIR /path/to/workdirWORKDIR /home进入容器默认进入的目录
ARG
ONBUILDONBUILD [INSTRUCTION]ONBUILD ADD . /app/src在build的时候触发
HEALTHCHECK
SHELL
STOPSIGNAL
看完这些介绍后请配合小栗子进行实例学习(案例解析DockerFile)

Docker流程图

7. 镜像打包

可以把本地的进行打成tar包,方便其他人员使用

#导出镜像到文件
docker save [OPTIONS] IMAGE [IMAGE...]
docker save -o redis.tar  docker.io/redis

#从文件导入镜像
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
docker import mytest.tar mytest:v1.0

8. 镜像发布

可以将自己制作的镜像发布到Docker Hub 上 具体操作有时间再补上,,,

9. 案例解析(DockerFile)

9.1 centos加上一些功能

9.1 .1 编写DockerFile

#以哪个镜像为基础镜像 第一行必须为 FROM
FROM centos
#作者信息
MAINTAINER hanlp<915619712@qq.com>
#声明变量
ENV MYPATH /usr/local
#定义登陆默认位置
WORKDIR $MYPATH
# 执行shell
RUN yum -y install vim
RUN yum -y install net-tools
 
#暴露端口
EXPOSE 80
CMD /bin/bash

9.1.2 build

build -f DockerFile -t  mycentos:v1.0 . 

build 完成后就可以在 shell docker images 里面查到了
注意:后面的点别丢了(点代表当前路径)

9.2 自制tomcat

FROM         centos
MAINTAINER hanlp<915619712@qq.com>

#把java与tomcat添加到容器中 add有解压功能
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE  8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out

9.3 tomcat官方DockerFile

FROM openjdk:14-jdk-oracle

ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME

# let "Tomcat Native" live somewhere isolated
ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR

# see https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/KEYS
# see also "update.sh" (https://github.com/docker-library/tomcat/blob/master/update.sh)
ENV GPG_KEYS 05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23

ENV TOMCAT_MAJOR 9
ENV TOMCAT_VERSION 9.0.33
ENV TOMCAT_SHA512 caaed46e47075aff5cb97dfef0abe7fab7897691f2e81a2660c3c59f86df44d5894a5136188808e48685919ca031acd541da97c4aba2512e0937455972004a2b

RUN set -eux; \
	\
# http://yum.baseurl.org/wiki/YumDB.html
	if ! command -v yumdb > /dev/null; then \
		yum install -y yum-utils; \
		yumdb set reason dep yum-utils; \
	fi; \
	if [ -f /etc/oracle-release ]; then \
# TODO there's an odd bug on Oracle Linux where installing "cpp" (which gets pulled in as a dependency of "gcc") and then marking it as automatically-installed will result in the "filesystem" package being removed during "yum autoremove" (which then fails), so we set it as manually-installed to compensate
		yumdb set reason user filesystem; \
	fi; \
# a helper function to "yum install" things, but only if they aren't installed (and to set their "reason" to "dep" so "yum autoremove" can purge them for us)
	_yum_install_temporary() { ( set -eu +x; \
		local pkg todo=''; \
		for pkg; do \
			if ! rpm --query "$pkg" > /dev/null 2>&1; then \
				todo="$todo $pkg"; \
			fi; \
		done; \
		if [ -n "$todo" ]; then \
			set -x; \
			yum install -y $todo; \
			yumdb set reason dep $todo; \
		fi; \
	) }; \
	_yum_install_temporary gzip tar; \
	\
	ddist() { \
		local f="$1"; shift; \
		local distFile="$1"; shift; \
		local success=; \
		local distUrl=; \
		for distUrl in \
# https://issues.apache.org/jira/browse/INFRA-8753?focusedCommentId=14735394#comment-14735394
			'https://www.apache.org/dyn/closer.cgi?action=download&filename=' \
# if the version is outdated (or we're grabbing the .asc file), we might have to pull from the dist/archive :/
			https://www-us.apache.org/dist/ \
			https://www.apache.org/dist/ \
			https://archive.apache.org/dist/ \
		; do \
			if curl -fL -o "$f" "$distUrl$distFile" && [ -s "$f" ]; then \
				success=1; \
				break; \
			fi; \
		done; \
		[ -n "$success" ]; \
	}; \
	\
	ddist 'tomcat.tar.gz' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz"; \
	echo "$TOMCAT_SHA512 *tomcat.tar.gz" | sha512sum --strict --check -; \
	ddist 'tomcat.tar.gz.asc' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc"; \
	export GNUPGHOME="$(mktemp -d)"; \
	for key in $GPG_KEYS; do \
		gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
	done; \
	gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz; \
	tar -xf tomcat.tar.gz --strip-components=1; \
	rm bin/*.bat; \
	rm tomcat.tar.gz*; \
	command -v gpgconf && gpgconf --kill all || :; \
	rm -rf "$GNUPGHOME"; \
	\
# https://tomcat.apache.org/tomcat-9.0-doc/security-howto.html#Default_web_applications
	mv webapps webapps.dist; \
	mkdir webapps; \
# we don't delete them completely because they're frankly a pain to get back for users who do want them, and they're generally tiny (~7MB)
	\
	nativeBuildDir="$(mktemp -d)"; \
	tar -xf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1; \
	_yum_install_temporary \
		apr-devel \
		gcc \
		make \
		openssl-devel \
	; \
	( \
		export CATALINA_HOME="$PWD"; \
		cd "$nativeBuildDir/native"; \
		aprConfig="$(command -v apr-1-config)"; \
		./configure \
			--libdir="$TOMCAT_NATIVE_LIBDIR" \
			--prefix="$CATALINA_HOME" \
			--with-apr="$aprConfig" \
			--with-java-home="$JAVA_HOME" \
			--with-ssl=yes; \
		make -j "$(nproc)"; \
		make install; \
	); \
	rm -rf "$nativeBuildDir"; \
	rm bin/tomcat-native.tar.gz; \
	\
# mark any explicit dependencies as manually installed
	deps="$( \
		find "$TOMCAT_NATIVE_LIBDIR" -type f -executable -exec ldd '{}' ';' \
			| awk '/=>/ && $(NF-1) != "=>" { print $(NF-1) }' \
			| sort -u \
			| xargs -r rpm --query --whatprovides \
			| sort -u \
	)"; \
	[ -z "$deps" ] || yumdb set reason user $deps; \
	\
# clean up anything added temporarily and not later marked as necessary
	yum autoremove -y; \
	yum clean all; \
	rm -rf /var/cache/yum; \
	\
# sh removes env vars it doesn't support (ones with periods)
# https://github.com/docker-library/tomcat/issues/77
	find ./bin/ -name '*.sh' -exec sed -ri 's|^#!/bin/sh$|#!/usr/bin/env bash|' '{}' +; \
	\
# fix permissions (especially for running as non-root)
# https://github.com/docker-library/tomcat/issues/35
	chmod -R +rX .; \
	chmod 777 logs temp work

# verify Tomcat Native is working properly
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

EXPOSE 8080
CMD ["catalina.sh", "run"]

10. 使用Docker Hub安装环境

10.1 安装tomcat

#1、搜索镜像
docker search tomcat
#2、拉取镜像
 docker pull tomcat
#3、根据镜像启动容器
docker run -d -p 8888:8080 tomcat

可以直接访问宿主机的 http://ip:8888 看下tom猫了

10.2 安装mysql

#1、搜索镜像
docker search mysql
#2、拉取镜像
 docker pull mysql
#3、根据镜像启动容器
docker run -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

启动完了链接数据试试。。。

10.3 安装redis

#同理自己来吧。。。

11. jekens git docker 继承发布项目 (待完成。。。。。。)

本文由鹏鹏出品
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值