环境准备
1、需要一点Linux基础
2、CentOS7
3、Xshell
系统内核
#系统内核
[root@iZwz9agfsj3krw28awnk3aZ /]# uname -r
3.10.0-514.26.2.el7.x86_64
系统版本
#系统版本
[root@iZwz9agfsj3krw28awnk3aZ /]# cat etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安装帮助文档
# 1、卸载旧环境
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2、安装环境
yum install -y yum-utils
# 3、设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #默认是国外的!
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #推荐使用阿里云的
# 4、更新索引
[root@iZwz9agfsj3krw28awnk3aZ /]# yum makecache fast
# 5、安装Docker相关的 docker-ce 是社区版
yum install docker-ce docker-ce-cli containerd.io
# 6、启动Docker
systemctl start docker
# 7、使用 docker version查看是否安装成功
docker run hello-world #运行hello-word
#查看镜像
[root@iZwz9agfsj3krw28awnk3aZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 9 months ago 13.3kB
了解卸载
# 1、卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2、删除资源--->默认路径
rm -rf /var/lib/docker
服务控制
找到镜像容器
# 1、创建目录
sudo mkdir -p /etc/docker
# 2、配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://x4hefn9e.mirror.aliyuncs.com"]
}
EOF
# 3、重启docker
sudo systemctl daemon-reload
# 4、开启Docker
sudo systemctl restart docker
Docker是如何工作的?
Docker是一个 Client-Server的结构。通过Socket从客户端访问!
Docker-Server接收到Docker-Client的指令,就会执行这个命令
Docker为什么比Linux快?
VM要重新加载操作系统CentOS7
Docker不需要加载操作系统
docker version #显示docker版本信息
docker info #显示docker的系统信息,包括镜像和容器数量
docker --help #帮助命令
[root@iZwz9agfsj3krw28awnk3aZ mysql]# docker pull mysql:5.7
5.7: Pulling from library/mysql
bb79b6b2107f: Pull complete
49e22f6fb9f7: Pull complete
842b1255668c: Pull complete
9f48d1f43000: Pull complete
c693f0615bce: Pull complete
8a621b9dbed2: Pull complete
0807d32aef13: Pull complete
f15d42f48bd9: Pull complete
098ceecc0c8d: Pull complete
b6fead9737bc: Pull complete
351d223d3d76: Pull complete
Digest: sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
镜像下载地址:https://hub.docker.com/search/?type=image
是镜像Id
[root@iZwz9agfsj3krw28awnk3aZ mysql]# docker rmi -f $(docker images -aq) #遍历删除
说明:我们有了镜像才可以创建容器,Linux ,下载一个 centos 镜像来测试学习
docker pull centos
退出容器
exit #退出并停止容器
Ctrl + P + Q #退出不停止容器
删除容器
docker rm 容器id #删除指定的容器,无法删除正在运行的容器
docker rm -f $(docker ps -aq) #删除所有容器
docker -a -q|xargs docker rm #删除所有容器
停止和重启容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止容器
-d 后台运行
查看镜像的元数据
#命令
docker inspect 容器id
#测试
[root@iZwz9agfsj3krw28awnk3aZ /]# docker inspect 480ddf3e2ce7
[
{
"Id": "480ddf3e2ce7b7642441836b7e92073c8b35c34bcffdeedd5897fd75b582f028",
"Created": "2020-10-26T08:55:52.347136353Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo carter;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 11665,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-10-26T08:55:52.780052286Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
"ResolvConfPath": "/var/lib/docker/containers/480ddf3e2ce7b7642441836b7e92073c8b35c34bcffdeedd5897fd75b582f028/resolv.conf"
}
]
进入当前运行的容器
#命令
docker exec -it 容器id bash shell
#测试
[root@iZwz9agfsj3krw28awnk3aZ /]# docker exec -it 480ddf3e2ce7 /bin/bash
[root@480ddf3e2ce7 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:55 ? 00:00:00 /bin/sh -c while true;do echo carter;sleep 1;done
root 340 0 0 09:01 pts/0 00:00:00 /bin/bash
root 362 340 0 09:01 pts/0 00:00:00 ps -ef
#命令
docker ps -a -n=1 显示1个最近的历史
#测试
[root@iZwz9agfsj3krw28awnk3aZ /]# docker ps -a -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c481d007b0cf centos "/bin/bash" 2 minutes ago Exited (0) 34 seconds
Docker安装Nginx
#搜索nginx
docker search nginx --filter STARS=90
#下载nginx
docker pull nginx
#查看所有镜像
[root@iZwz9agfsj3krw28awnk3aZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f35646e83998 13 days ago 133MB
centos latest 0d120b6ccaa8 2 months ago 215MB
#运行nginx
#3344是主机端口
#80是容器端口
#nginx-01是别名
[root@iZwz9agfsj3krw28awnk3aZ /]# docker run -d --name nginx-01 -p 3344:80 nginx
1b6859135b371af58cc50555e6ee234e8c6f5f5706aa994a4362828187eb6203
[root@iZwz9agfsj3krw28awnk3aZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1b6859135b37 nginx "/docker-entrypoint.…" 8 seconds ago Up 7 seconds 0.0.0.0:3344->80/tcp nginx-01
#测试nginx
[root@iZwz9agfsj3krw28awnk3aZ /]# curl localhost:3344
进入Nginx-01容器
#显示正在运行的进程
docker ps
#测试
[root@iZwz9agfsj3krw28awnk3aZ /]# docker ps
CONTAINER ID IMAGE STATUS PORTS NAMES
1b6859135b37 nginx Up 16 hours 0.0.0.0:3344->80/tcp nginx-01
#进入Nginx容器
[root@iZwz9agfsj3krw28awnk3aZ /]# docker exec -it nginx-01 /bin/bash
#找到Nginx位置
root@1b6859135b37:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@1b6859135b37:/# cd /etc/nginx
root@1b6859135b37:/etc/nginx#
作业2 docker装一个Tomcat
安装es+kibana
# --net somenetwork 网络配置
#启动elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2 #启动就直接卡了
docker stats 查看CUP的状态
# es是十分耗内存的
#停止整个docker
#限制内存运行
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xms512m" elasticsearch:7.6.2
#安装
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
#访问测试
http://47.115.120.36:8088/
镜像是一种轻量级、可执行的独立软件包,用来打包运行环境开发的软件,它包含某个软件所有的内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包成镜像,可以直接跑起来
如何得到镜像:
UnionFS(联合文件系统)
将所有的信息进行分层管理,我们下载的时候一层一层的是这个!
Docker的镜像实际上就是由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs:bootloader【加载器】+kernel【内核】,bootloader主要引导加载kernel
rootfs:在bootfs之上,主要是一些文件、目录… rootfs就是各种不同的操作系统发行版本,比如Ubuntu,CentOS等等
[root@iZwz9agfsj3krw28awnk3aZ /]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
bb79b6b2107f: Already exists #这一层已经曾在,不会继续下载
1ed3521a5dcb: Pull complete
5999b99cee8f: Pull complete
dd17877d8f2d: Pull complete
4863b56b12a8: Pull complete
069e700bc397: Pull complete
Digest: sha256:a0494b60a0bc6de161d26dc2d2f9d2f1c5435e86a9e5d48862a161131affa6bd
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
[root@iZwz9agfsj3krw28awnk3aZ /]#
如何提交自己的镜像
docker commit 提交容器成为一个新的副本
#命令和Git原理一样
docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:[TAG]
#运行tomcat
docker run -it -p 8080:8080 tomcat
#进入默认tomcat
docker exec -it ee5e125ade19 /bin/bash
#拷贝样式---默认的tomcat无页面
cp -r webapps.dist/* webapps
#退出
exit
#查看容器进程
docker ps
#CommitImage Author:Carter Message:add webapps application ContainerId NewName:Version
docker commit -a="Carter" -m="add webapps application" ee5e125ade19 tomcat01:1.0
#Container to start and open
docker run -it tomcat01 /bin/bash
程序保存数据在容器中,那么我们删除容器,我们的数据就也被删除了~
需求:数据可不可以持久化,存储在本地
容器之间有一个数据共享技术!Docker容器中产生的数据同步到本地!
这就是数据卷技术,目录挂载,将容器内的目录,挂载到Linux中
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的
方法一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录 -p 主机端口:容器端口
#测试---会话1
[root@iZwz9agfsj3krw28awnk3aZ home]# docker run -it -v /home/test:/home centos /bin/bash
[root@696416ec7208 /]#
#查看容器是否挂载---克隆会话2
docker inspect 容器Id
#挂载信息
"Mounts": [
{
"Type": "bind",
"Source": "/home/test", #本地Linux目录
"Destination": "/home", #容器目录
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
#测试文件同步
#容器中新建---carter.java
[root@696416ec7208 home]# touch carter.java
[root@696416ec7208 home]# ls
carter.java
#Linux中路径下
[root@iZwz9agfsj3krw28awnk3aZ test]# ls
carter.java
#搜索mysql镜像
[root@iZwz9agfsj3krw28awnk3aZ /]# docker search mysql
#下载获取镜像
[root@iZwz9agfsj3krw28awnk3aZ /]# docker pull mysql:5.7
#查看镜像
[root@iZwz9agfsj3krw28awnk3aZ /]# docker images
#启动数据挂载
-d 后台运行
-p 端口映射
-v 数据卷挂载x2
-e 环境配置
--name 别名
[root@iZwz9agfsj3krw28awnk3aZ /]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v/home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7
#启动成功之后本地测试连接
-h 主机地址【默认localhost】
-P SQLServer的端口
-u 账户
-p 密码
mysql -h47.115.120.36 -P3310 -uroot -p
#删除容器
docker rm -f 容器name --可以删除正在运行的容器
docker rm -f 容器id --可以删除正在运行的容器
#匿名挂载
-v 容器内路径---未指定容器外路径
-P 大P 随机映射端口
--name 别名
docker run -d -P --name nginx01 -v /etc/ngix nginx
#查看所有卷的情况
docker volume ls
#具名挂载--->前面不加/表示:naming-nginx只是个配置文件
docker run -d -P --name nginx -v naming-nginx nginx
#查看具名卷的位置
docker volume inspect naming-nginx
大多数情况下我们使用具名挂载
就是用来构建Docker镜像的镜像文件!命令脚本,通过这个脚本可以生成镜像,脚本就是一个一个命令,每一个命令就是一层
#创建一个dockerfile文件
#文件内容都是大写的
#脚本文件
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end-----"
CMD /bin/bash
#这里的每个命令就是一层
#脚本内容
[root@iZwz9agfsj3krw28awnk3aZ docker-test-volume]# cat dockerfile1
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end-----"
CMD /bin/bash
#生成镜像
[root@iZwz9agfsj3krw28awnk3aZ docker-test-volume]# docker build -f dockerfile1 -t carter/centos .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 0d120b6ccaa8
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in dd63c90ee839
Removing intermediate container dd63c90ee839
---> 482f49ff7b5c
Step 3/4 : CMD echo "-----end-----"
---> Running in c7e0f05ed913
Removing intermediate container c7e0f05ed913
---> 769f3e9bc4d2
Step 4/4 : CMD /bin/bash
---> Running in 4e9d29158f92
Removing intermediate container 4e9d29158f92
---> 236d4157063a
Successfully built 236d4157063a
Successfully tagged carter/centos:latest
#查看生成镜像
[root@iZwz9agfsj3krw28awnk3aZ docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
carter/centos latest 236d4157063a 2 minutes ago 215MB
数据卷容器
两个MySQL同步数据
#启动一个容器
docker run -it --name docker01 carter/centos
#容器docker02继承docker01
docker run -it --name docker02 --volumes-from docker01 carter/centos
两个容器的数据卷存放位置一样,所以一个容器死亡,并不会影响另一个容器数据
/var/lib/docker/volumes/bbbc2824b1267ff1f4d9b93e95b1469eba99474f17e0c788e956d8cc4ba88794/_data
/var/lib/docker/volumes/b3496be393d1b062d9dbb1a38a6f44388ec340ed585b9f6ddb2074b4792b6831/_data
/var/lib/docker/volumes/bbbc2824b1267ff1f4d9b93e95b1469eba99474f17e0c788e956d8cc4ba88794/_data
/var/lib/docker/volumes/b3496be393d1b062d9dbb1a38a6f44388ec340ed585b9f6ddb2074b4792b6831/_data
步骤:
DokcerFile:构建文件,定义一切的步骤,源代码
DockerImages:通过DockerFile生成的镜像,最终发布和运行的产品
Docker容器:容器是镜像运行起来提供服务器
以前我们用别人的,现在我们自己写
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的:姓名+邮箱
RUN # Docker镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat镜像 的压缩包
WORKDIR # 镜像工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置
CMD # 指定容器启动的时候要运行的命令,只有最后一个回生效,可以被替代
ENTRYPOINT # 指定这个容器启动时要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令。触发指令
COPY # 类似ADD 将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量
DokcerHup 中 99%镜像都是从这个基础镜像过来的 FROM scratch , 然后配置我们需要的软件来进行构建
创建一个自己的centos
# 编写dockerfile的文件
FROM centos
MAINTAINER carter<[email protected]> # 建造者
ENV MYPATH /usr/local # 运行后直接到local目录
WORKDIR $MYPATH
RUN yum -y install vim # 增加vim命令
RUN yum -y install net-tools # 增加 ifconfig 命令
EXPOSE 80
CMD echo $MYPATH
CMD echo "------end------"
CMD /bin/bash
# 构建镜像
docker build -f mydockerfile -t mycentos:1.0 .
# 查看历史
docker history 792b31f69875
CMD # 指定容器启动的时候要运行的命令,只有最后一个回生效,可以被替代
ENTRYPOINT # 指定这个容器启动时要运行的命令,可以追加命令
# 测试cmd命令
[root@iZwz9agfsj3krw28awnk3aZ dockerfile]# vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"] # 列出当前所有的目录
[root@iZwz9agfsj3krw28awnk3aZ dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest . #创建cmdtest
Successfully built 7f2825a96870
Successfully tagged cmdtest:latest
# docker run 7f2825a96870 #运行镜像,输出centos中当前所有目录
[root@iZwz9agfsj3krw28awnk3aZ dockerfile]docker run 7f2825a96870
.
bin
dev
# 后面追加命令 -l ls -al ==》返回列表的详细数据
[root@iZwz9agfsj3krw28awnk3aZ dockerfile]# docker run 7f2825a96870 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
# 用CMD的情况下 -l 替换了 CMD ["ls","-a"] 命令,-l不是命令,运行报错
# 必须自己写好
docker run 7f2825a96870 ls -al
# 测试entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
# 构建镜像
docker build -f dockerfile-entrypoint-test -t entrypoint-test .
# 运行镜像
docker run 7ff8394f8f0b
# 追加命令 -l ===> ENTRYPOINT ["ls","-al"] ===》列出当前所有目录详情
docker run 7ff8394f8f0b -l
1、准备镜像文件 tomcat的压缩包,JDK压缩包!
2、编写DockerFile文件 , 官方命令Dockerfile
,build会自动寻找这个文件,就不需要-f
指定了
# 配置Dockerfile
FROM centos
MAINTAINER carter<[email protected]>
COPY remember.txt /usr/local/remember.txt
ADD jdk-8u271-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.39.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_271
ENV CLASS_PATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.39
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.39
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.39/startup.sh && tail -F /usr/local/apache-tomcat-9.0.39/logs/catalina.out
# 构建镜像
docker build -t diytomcat .
# 运行测试
docker run
-d # 后台运行
-p 9090:8080 # 端口映射
--name cartertomcat #设置别名
-v /home/carter/build/tomcat/test:/usr/local/apache-tomcat-9.0.39/webapps/test # 文件挂载
-v /home/carter/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.39/logs # 日志挂载
diytomcat # 镜像名称
# 等上一段时间后,进入容器
docker exec -it 59c2ac47f960 /bin/bash
#测试tomcat
curl localhost:9090
docker run -it -p 9090:8080 --name cartertomcat -v /home/carter/build/tomcat/test:/usr/local/apache-tomcat-9.0.39/webapps/test -v /home/carter/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.39/logs diytomcat /bin/bash
docker run -d -p 9090:8080 --name cartertomcat -v /home/carter/build/tomcat/test:/usr/local/apache-tomcat-9.0.39/webapps/test -v /home/carter/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.39/logs diytomcat /bin/bash
DockerHub
#发布到Docker Hub
[root@iZwz9agfsj3krw28awnk3aZ test]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
docker login -u carter # 登录Docker Hub
docker push author's name/docekr image's name : version #发布
# Docker 发布问题?
docker tag {IMAGE ID} carter/tomcat:1.0 # 设置作者+版本 标签
阿里云 镜像发布
# 1.登录阿里云功能
# 2.找到容器镜像服务
# 3.创建一个命名空间【只能注册3个】
# 4.创建 本地 镜像仓库
# 5.参考carter_test官方文档