#1.卸载旧版本
yum remove docker
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2.需要的安装包
yum -y install yum-utils device-mapper-persistent-datalvm2
#3.设置镜像的仓库
yum-config-manager \
–add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#4.更新yum软件包索引
yum makecache fast
#5.安装docker相关的 docker-ce 社区版 而ee是企业版
yum install docker-ce docker-ce-cli containerd.io # 安装社区版
yum install docker-ee docker-ee-cli containerd.io # 安装企业版
#6.启动Docker服务
systemctl start docker
#7.使用docker version查看是否按照成功
docker version
#8.设置开机自启动
systemctl enable docker
docker search 镜像名 搜索镜像
docker pull 镜像名 拉取镜像
docker rmi -f 镜像名或镜像ID
docker run 镜像名 启动容器
docker ps 运行中的容器
docker ps -a 所有容器包含运行过的容器
exit 退出并停止容器
ctrl+p+q 退出但不停止容器,后台运行
docker rm 容器id 删除容器(运行中的不能删除)
docker rm -f 容器id 强制删除容器
docker start 容器id 启动容器
docker restart 容器id 重启容器
docker stop 容器id 停止容器
docker logs -f -t --tail 行数 容器id 查看正在运行的容器日志
docker top 容器id 查看容器中的进程信息
docker inspect 容器id 查看容器元数据
docker exec -it 容器id 进入容器并开启新的终端
docker attach 容器id 进入容器不开启新的终端
docker inspect 容器ID 可以查看到挂载的目录地址
–volume-from 容器之间挂载目录
-v 挂载数据卷 目标目录:源目录
-p 端口映射 目标端口:源端口
-d 后台方式运行
-it 交互方式运行
-e 配置运行环境
docker run --name mynginx2 -d -p 3344:80 nginx
docker run --name mytomcat2 -d -p 3355:8080 tomcat
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” -e ES_JAVA_OPTS=“-Xms64m -Xmx512m” elasticsearch:7.6.2
docker pull mysql:8.0.15
docker run -d --name mysqlpro -p 3306:3306 -v /opt/mysql/conf:/etc/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=zhukai mysql:8.0.15
docker commit -a=“zhukai” -m=“cp -r webapp.list/* webapps” 容器ID tomacatimages:1.0 提交镜像
docker commit -a=“zhukai” -m=“create mynginx” 容器ID nginximages:1.0
docker commit -a=“zhukai” -m=“create myelasticsearchimages” 容器ID myelasticsearchimages:1.0
docker commit -a=“zhukai” -m=“create mysqlimages” 容器ID mysqlproimages:1.0
DOCKERFILE
指令:
FROM:基础镜像,基于哪个镜像
MAINTAINER:设置作者信息,已启用,使用LABEL代替,如
MAINTAINER “kaven” 可以替换为LABEL maintainer=“kaven”
RUN:镜像构建的时候需要执行的命令,一个文件中可以包含多个RUN命令。示例RUN [“executable”, “param1”, “param2”],要注意的是,executable是命令,后面的param是参数。RUN [“yum”, “install”, “-y”, “nginx”],相当于yum install -y nginx ,RUN [“ls”, “-a”]。相当于 ls -a ,打印文件名。RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定–no-cache参数,如:docker build --no-cache。
由于RUN命令会生成一个镜像层,所以RUN并不是越多越好,需要合理使用,如果一个RUN中执行多个命令,可以使用 && 连接,如果命令过长,可以使用 \ 换行。例如
RUN apt-get update && apt-get install -y \
bzr
cvs
git
mercurial
subversion
并且这样写还有个优点,apt-get update 和 apt-get install 被放在一个 RUN 指令中执行,这样能够保证每次安装的是最新的包。如果 apt-get install 在单独的 RUN 中执行,则会使用 apt-get update 创建的镜像层,而这一层可能是很久以前缓存的。
ADD:添加文件,如果要添加mysql,则需要把mysql的压缩包加进来。将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。ADD指令的目的的位置则必须是容器内部的一个绝对路径。
如 ADD test /absoluteDir/ # 添加 “test” 到 /absoluteDir/
COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源,就是不能解压,其他限制条件跟ADD一样。
WORKDIR:指定工作目录,类似于cd命令,之后的命令都是基于此工作目录。如WORKDIR /path/to/workdir (这时工作目录为/path/to/workdir)。通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
LABEL:用于为镜像添加元数据。LABEL = = = … 示例LABEL version=“1.0” description=“这是一测试工程”
ENV:ENV 指令用来在镜像构建过程中设置环境变量,这些变量会永久地保存到该镜像创建的任何容器中。通过ENV 定义的环境变量,可以被后面的所有指令中使用,但不能被docker run 的命令参数引用。ENV my_path /usr/local/docker
VOLUME:添加卷,挂载目录,用于指定持久化目录。VOLUME [“/var/www”, “/var/log/apache2”, “/etc/apache2”],一个卷可以存在于一个或多个容器的指定目录。
EXPOSE:指定暴露镜像的端口供主机做映射,例如EXPOSE 80 443,EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。
CMD:构建容器后调用,也就是在容器启动时才进行调用,存在多个CMD时只有最后一个生效,也支持exec语法。例如CMD echo “docker test”,RUN指令在构建镜像时执行命令,并生成新的镜像;CMD指令在构建镜像时并不执行任何命令,
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。如果用户在命令行界面运行docker run 命令时指定了命令参数,则会覆盖CMD 指令中的命令。如在镜像中添加了CMD [“ls”,“-a”],在启动镜像创建容器时,docker run时,添加"-l"就会报错,本意是ls -a -l,是因为-l覆盖了ls -a导致报错。
ENTRYPOINT:ENTRYPOINT [“executable”, “param1”, “param2”] 例如ENTRYPOINT [“echo”,“docker test”],ENTRYPOINT 指令和CMD 类似,它也可用户指定容器启动时要执行的命令。但如果dockerfile 中也有CMD 指令,CMD 中的参数会被附加到ENTRYPOINT 指令的后面。如果这时docker run 命令带了参数,这个参数会覆盖掉CMD 指令的参数,并也会附加到ENTRYPOINT 指令的后面。可以看出,相对来说ENTRYPOINT 指令优先级更高。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。如在镜像中添加了ENTRYPOINT [“ls”,“-a”],在启动镜像创建容器时,docker run时,添加"-l"就不会报错,原因是ENTRYPOINT在ls -a后面可以追加-l。
FROM 基础镜像
VOLUME [“挂载目录1”,“挂载目录2”]
CMD echo “-------end-------”
CMD /bin/bash
docker build -f DOCKERFILE文件名 -t 镜像名字(可以带版本).
-f 代表哪个文件路径下的DOCKERFILE文件,-t代表要生成的镜像名字,可以附加版本,后面还有个.千万不能少
TOMCAT的Dockerfile
FROM centos:7
LABEL maintainer=“zhukai”
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u161-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.75.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_161
ENV CLASSPATH
J
A
V
A
H
O
M
E
/
l
i
b
/
d
t
.
j
a
r
:
JAVA_HOME/lib/dt.jar:
JAVAHOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.75
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.75
ENV PATH
P
A
T
H
:
PATH:
PATH:JAVA_HOME/bin:
C
A
T
A
L
I
N
A
H
O
M
E
/
l
i
b
:
CATALINA_HOME/lib:
CATALINAHOME/lib:CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.75/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.75/logs/catalina.out
#开始build
docker build -t tomcatstudy
#启动镜像创建容器
docker run -d --name testtomcatdockerfile -p 8080:8080 -v /home/zhukai/build/tomcat/test:/usr/local/apache-tomcat-9.0.75/webapps/test -v /home/zhukai/build/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.75/logs bed46696e449
Docker网络
自定义网络 network
docker network --help
docker network ls
docker network create --dirver bridge --subnet 192.168.0.16 --gateway 192.168.0.1 mynet
–subnet 子网 --gateway网关 --dirver 连接模式 bridge 桥接模式
然后在使用的时候,如启动容器的时候可以指定网络,如 docker run -d --name testtomcatdockerfile -p 8080:8080 -net mynet tomcat
这样做的好处就是,可以直接通过名字去pin容器,如 docker exec -it 容器1 pin 容器2
不同的集群使用不同的网络,保证集群是安全和健康的。如redis集群是192.167.0.0,mysql是192.168.0.0
Docker网络连通