Docker是一个开源的应用容器引擎;是一个轻量级容器技术;
Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;
运行中的这个镜像称为容器,容器启动是非常快速的。
Docker主要是用来解决环境问题(例如开发和线上环境不一致问题)
docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);
docker客户端(Client):连接docker主机进行操作;
docker仓库(Registry):用来保存各种打包好的软件镜像;
docker镜像(Images):软件打包好的镜像;放在docker仓库中;
docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用
使用Docker的步骤:
1)、安装Docker
2)、去Docker仓库找到这个软件对应的镜像;
3)、使用Docker运行这个镜像,这个镜像就会生成一个Docker容器;
4)、对容器的启动停止就是对软件的启动停止;
yum install -y docker
systemctl start docker
systemctl enable docker
systemctl stop docker
注意:哪些想要在windows上直接安装的小伙伴们,劝你们早点收手把,直接linux安装把,别瞎瘠薄折腾了!!!
操作 | 命令 | 说明 |
---|---|---|
检索 | docker search 关键字 eg:docker search redis | 我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。 |
拉取 | docker pull 镜像名:tag | :tag是可选的,tag表示标签,多为软件的版本,默认是latest |
列表 | docker images | 查看所有本地镜像 |
删除 | docker rmi image-id | 删除指定的本地镜像 |
操作 | 命令 | 说明 |
---|---|---|
新建并启动容器 | 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:容器内路径 目的主机路径 |
容器内外是两个网络,要想通过外面的主机访问容器里面的端口需要做端口映射。例如容器里面启动了一个tomcat,需要访问8080端口,可是这个端口是容器内部的,所以想要访问就需要在外部也开一个端口进行映射,shell docker run -d -p 80:8080 tomcat
也可以使用大P ,大P是随机进行映射的。
有时候我们不熟环境,希望生成的数据能够保存起来,不能删除容器后数据就消失了,例如部署mysql,mysql的数据如果放在容器内,容器删除则数据就没了;部署redis的话 开启的aof,rdb这些数据也是希望能保存下来的,所以产生了磁盘挂在(说白点就是容器内一个或者多个文件夹和主机中的一个或多个文件进行数据共享,容器删除后,数据就留在了主机上,并不会删除)
#挂载磁盘
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
#查看是否挂载成功
docker inspect 容器ID
#只读挂载
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
启动一个容器,然后对容器进行操作,操作后的容器可以生成一个新的镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
eg: docker commit 77857578237d mytest:1.0
DockerFile可以说是基于一个镜像进行对其一系列的操作生成新的镜像,DockerFile就是对这个镜像的一系列操作的描述。
基于DockerFile创建容器,主要分为三个步骤
build -f DockerFilePath -t imageName:tag
下面介绍一些DockerFile的关键字(预留字)
关键字 | 语法 | 例子 | 备注 |
---|---|---|---|
FORM | FROM [–platform=] [:] [AS ] | eg: FROM scrtch | 都需要有个父镜像 base镜像是 scratch ,就像java中的Object一样 |
RUN | 两种语法 1:RUN 2: RUN [“executable”, “param1”, “param2”] |
RUN yum -y install vim | 就是用来执行shell的 |
CMD | CMD [“executable”,“param1”,“param2”] CMD command param1 param2 |
CMD echo “This is a test.” | wc - CMD ["/usr/bin/wc","–help"] |
用来执行命令的,一个DockerFile只有一个,多个的话前面会被覆盖 |
LABEL | LABEL |
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的描述,可以写上邮箱作者版本什么的,,, |
MAINTAINER | MAINTAINER | LABEL maintainer=“[email protected]” | 主要是描述作者信息,跟LABEL 作用类似 |
EXPOSE | EXPOSE [/…] | EXPOSE 80/udp | 暴露端口,run的时候使用-p进行映射 |
ENV | ENV ENV |
ENV myName=“John Doe” ENV JAVA_HOME=/local/usr/jdk1.8 |
环境变量 |
ADD | ADD [–chown=:] … | ADD hom* /mydir/ | 从宿主机上拷贝文件到容器 如果是tar文件,则会自动解压 |
COPY | COPY [–chown=:] … | COPY hom* /mydir/ | 从宿主机上拷贝文件到容器,没有解压功能 |
ENTRYPOINT | ENTRYPOINT [“executable”, “param1”, “param2”] ENTRYPOINT command param1 param2 |
ENTRYPOINT exec top -b | 功能和cmd类似,但是cmd会被覆盖 而这个是追加 |
VOLUME | VOLUME ["/data"] | VOLUME /myvol | 挂载卷(只能指定容器内的目录) |
USER | USER [:] | USER admin | 使用用户 默认root |
WORKDIR | WORKDIR /path/to/workdir | WORKDIR /home | 进入容器默认进入的目录 |
ARG | |||
ONBUILD | ONBUILD [INSTRUCTION] | ONBUILD ADD . /app/src | 在build的时候触发 |
HEALTHCHECK | |||
SHELL | |||
STOPSIGNAL |
看完这些介绍后请配合小栗子进行实例学习(案例解析DockerFile)
可以把本地的进行打成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
可以将自己制作的镜像发布到Docker Hub 上 具体操作有时间再补上,,,
#以哪个镜像为基础镜像 第一行必须为 FROM
FROM centos
#作者信息
MAINTAINER hanlp<[email protected]>
#声明变量
ENV MYPATH /usr/local
#定义登陆默认位置
WORKDIR $MYPATH
# 执行shell
RUN yum -y install vim
RUN yum -y install net-tools
#暴露端口
EXPOSE 80
CMD /bin/bash
build -f DockerFile -t mycentos:v1.0
build 完成后就可以在 shell docker images
里面查到了
FROM centos
MAINTAINER hanlp<[email protected]>
#把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
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"]
#1、搜索镜像
docker search tomcat
#2、拉取镜像
docker pull tomcat
#3、根据镜像启动容器
docker run -d -p 8888:8080 tomcat
可以直接访问宿主机的 http://ip:8888 看下tom猫了
#1、搜索镜像
docker search mysql
#2、拉取镜像
docker pull mysql
#3、根据镜像启动容器
docker run -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
启动完了链接数据试试。。。
#同理自己来吧。。。