Docker基本操作
Docker的基本组成

镜像(image):
docker镜像就好比是一个目标,可以通过这个目标来创建容器服务,tomcat镜像>run>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的. 启动,停止,删除,基本命令 目前就可以把这个容器理解为就是一个简易的 Linux系统。
仓库(repository):
仓库就是存放镜像的地方! 仓库分为公有仓库和私有仓库。(很类似git) Docker Hub是国外的。 阿里云…都有容器服务器(配置镜像加速!)
安装Docker
环境查看
#Linux要求内核3.0以上
[root@yuan ~]# uname -r
3. 10.0-1127.19.1.el7.x86_64
#系统版本
[root@yuan ~]# 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"
安装
帮助文档:https://docs.docker.com/engine/install/
#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 \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云镜像,速度快
#更新yum软件包索引
yum makecache fast
#4.安装docker相关的 docker-ce 社区版 而ee是企业版
yum install docker-ce docker-ce-cli containerd.io #安装社区版即可
#或者指定安装的版本
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
#6.启动Docker
systemctl start docker
#6. 使用docker version查看是否按照成功
docker version

7. 测试
docker run hello-world

#8.查看已经下载的镜像(从这里可以查看已有镜像的)
docker images

卸载Docker
#1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2. 删除资源
rm -rf /var/lib/docker
# /var/lib/docker 是docker的默认工作路径!
阿里云镜像加速
- 登录阿里云,找到容器镜像服务

- 找到镜像加上地址

- 配置使用
#创建目录
sudo mkdir -p /etc/docker
#编写配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://l259soi6.mirror.aliyuncs.com"]
}
EOF
#重启
sudo systemctl daemon-reload
#启动
sudo systemctl restart docker

Run的流程和Docker的原理

docker run 流程图

Docker的原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
Docker-Server接收到Docker-Client的指令,就会执行这个命令!

为什么Docker比Vm快
1、docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。 2、docker利用的是宿主机的内核,而不需要Guest OS。

因此,当新建一个 容器时**,docker不需要和虚拟机一样重新加载一个操作系统内核**。仍而避免引导、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了这个复杂的过程,因此新建一个docker容器只需要几秒钟。
Docker镜像的基本命令
帮助命令
docker version #显示docker的版本信息。
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
帮助文档的地址:https://docs.docker.com/engine/reference/commandline/build/
docker images查看所有本地的主机上的镜像
[root@yuan ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 5 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAF 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a #列出所有镜像
-q #显示镜像的id
docker images --help,查看可选参数
docker search mysql,搜索镜像
也可以在搜索帮助文档:https://hub.docker.com/
[root@yuan ~]# docker search mysql #搜索镜像为mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql/mysql-server Optimized MySQL Server Docker images. Create… 906 [OK]
# --filter=STARS=3000 #过滤,搜索出来的镜像收藏STARS数量大于3000的
[root@yuan ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker search images --help,查看可选参数
docker pull:下载镜像
# 下载镜像 docker pull 镜像名[:tag]
[root@yuan ~]# docker pull mysql
Using default tag: latest #如果不写tag,默认就是latest,下载最新的
latest: Pulling from library/mysql
72a69066d2fe: Pull complete #分层下载: docker image 的核心 联合文件系统
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 # 签名防伪
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
#指定版本下载
[root@yuan ~]# docker pull mysql:5.7 #指定mysql版本为5.7
5. 7: Pulling from library/mysql
72a69066d2fe: Already exists
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker pull images --help,查看可选参数
docker rmi 删除镜像
[root@yuan /]# docker rmi -f容器id #删除指定的容器
[root@yuan /]# docker rmi -f 容器id 容器id 容器id 容器id #删除多个容器
[root@yuan /]# docker rmi -f $(docker images -aq) #删除全部的容器
Docker容器的命令
说明:我们有了镜像才可以创建容器,Linux,下载centos镜像来学习
镜像下载
#docker中下载centos
docker pull centos
docker run [可选参数]
#参数说明
--name="Name" 容器名字tomcat01 tomcat02,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p(小写) 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p主机端口:容器端口(常用)
-p容器端口 -p的4种方式
-P(大小) 随机指定端口
#测试,启动并进入容器
[root@yuan ~]# docker run -it centos /bin/bash
[root@084596d7c0d3 /]# ls #查看容器内的sentos
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@084596d7c0d3 /]# exit #从容器中返回主机
exit
[root@yuan ~]# ls /
bin dev home lib64 media opt proc run srv test1 usr www
boot etc lib lost+found mnt patch root sbin sys tmp var
[root@yuan ~]#
列出所有运行的容器
# docker ps命令
#列出当前正在运行的容器
-a #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器
-q #显示容器的编号
[root@yuan ~]# docker ps #列出当前正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@yuan ~]# docker ps -a #列出当前正在运行的容器+带出历史运行过的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
084596d7c0d3 centos "/bin/bash" 7 minutes ago Exited (0) 5 minutes ago wonderful_darwin
328f96b56bdb hello-world "/hello" 7 hours ago Exited (0) 7 hours ago musing_ellis
aac537812f96 hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago wonderful_lamport
[root@yuan ~]# docker ps -a -n=1 #显示最近创建1的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
084596d7c0d3 centos "/bin/bash" 7 minutes ago Exited (0) 5 minutes ago wonderful_darwin
[root@yuan ~]# docker ps -a -q #显示所有容器的编号
084596d7c0d3
328f96b56bdb
aac537812f96
exit #直接容器停止并退出
ctrl +P+Q # 容不停止退出
删除容器
#删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
docker rmi -f 容器id
#杀死运行的容器:
docker kill $(docker ps -a -q)
#删除所有容器:
docker rm $(docker ps -a -q)
#强制删除所有镜像:
docker rmi -f $(docker images -q)
#docker删除所有停止的容器
docker rm $(sudo docker ps -a -q)
启动和停止容器的操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
其它基本命令
后台启动命令
#命令 docker run -d 镜像名
[root@yuan ~]# docker run -d centos
#doccker 使用后台运行,就必须要有一个前提运行进程,docker没用发现应用,就会自动停止
#nginx:容器启动后,发现没用提供服务,就会立刻停止,就没有进程了
查看日志
#自己编写一段shlle脚本
[root@yuan ~]# docker run -d centos /bin/sh -c "while true;do echo yuan;sleep 1;done"
2b9769fa265843bddad852c2a5effb3ca208fd4cee116ef41427a81f0c160de1
[root@yuan ~]# docker ps #查看centos是否在后台运行
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b9769fa2658 centos "/bin/sh -c 'while t…" 7 seconds ago Up 6 seconds pedantic_mayer
#显示日志
-tf #显示日志
--tail number #要显示日志条数
[root@yuan ~]# docker logs -tf --tail 10 2b9769fa2658 #查看centos的前10条日志
2022-02-23T01:22:01.676927165Z yuan
2022-02-23T01:22:02.683064380Z yuan
2022-02-23T01:22:03.684921592Z yuan
2022-02-23T01:22:04.687020821Z yuan
2022-02-23T01:22:05.689034931Z yuan
2022-02-23T01:22:06.691270963Z yuan
2022-02-23T01:22:07.693456263Z yuan
2022-02-23T01:22:08.695734978Z yuan
2022-02-23T01:22:09.698152340Z yuan
2022-02-23T01:22:10.700539806Z yuan
2022-02-23T01:22:11.735604439Z yuan
查看容器中的进程信息
#查看容器的进程信息
docker top 容器id
#测试
[root@yuan ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b9769fa2658 centos "/bin/sh -c 'while t…" 8 minutes ago Up 8 minutes pedantic_mayer
[root@yuan ~]# docker top 2b9769fa2658 #查看容器的进程信息
UID PID PPID C STIME TTY TIME CMD
root 7029 7009 0 09:21 ? 00:00:00 /bin/sh -c while true;do echo yuan;sleep 1;done
root 8525 7029 0 09:30 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
[root@yuan ~]#
查看镜像的元数据
#命令
docker inspect 容器id
#测试
[root@yuan ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b9769fa2658 centos "/bin/sh -c 'while t…" 34 minutes ago Up 34 minutes pedantic_mayer
[root@yuan ~]# docker inspect 2b9769fa2658
[
{
"Id": "2b9769fa265843bddad852c2a5effb3ca208fd4cee116ef41427a81f0c160de1",
"Created": "2022-02-23T01:21:31.272695941Z",
"Path": "/bin/sh",
......
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
进入容器的拷贝命令
#容器 通常是后台的方式运行的
#命令
docker exec -it 容器id baseShell
#测试方式一
[root@yuan ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b9769fa2658 centos "/bin/sh -c 'while t…" 45 minutes ago Up 45 minutes pedantic_mayer
[root@yuan ~]# docker exec -it 2b9769fa2658 /bin/bash #进入容器contos
[root@2b9769fa2658 /]# ls -a
. .dockerenv dev home lib64 media opt root sbin sys usr
.. bin etc lib lost+found mnt proc run srv tmp var
[root@2b9769fa2658 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 01:21 ? 00:00:01 /bin/sh -c while true;do echo yuan;sleep 1;done
root 2748 0 0 02:07 pts/0 00:00:00 /bin/bash
root 2787 1 0 02:07 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr
root 2788 2748 0 02:07 pts/0 00:00:00 ps -ef
[root@2b9769fa2658 /]#
#方式二
docker attach 容器id
#测试
[root@yuan ~]# docker attach 2b9769fa2658
正在执行的当前的代码....
两者的区别
# docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach #进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径
#测试
[root@yuan home]# ls -a
. .. redis www yuan
[root@yuan home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
980d85c0ab6b centos "/bin/bash" 18 minutes ago Up 18 minutes sharp_saha
#进入容器内
[root@yuan home]# docker attach 980d85c0ab6b
[root@980d85c0ab6b /]# cd home
[root@980d85c0ab6b home]# ls -a
. ..
#在容器的home目录下新建一个文件
[root@980d85c0ab6b home]# touch test.java
[root@980d85c0ab6b home]# ls -a
. .. test.java
[root@980d85c0ab6b home]# exit
exit
[root@yuan home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#将容器内的test.java复制到到主机中
[root@yuan home]# docker cp 980d85c0ab6b:/home/test.java /home
[root@yuan home]# ls -a
. .. redis test.java www yuan
[root@yuan home]#
基本命令小结

命令大全
attach Attach local standard input, output, and error streams to a running container
#当前shell下 attach连接指定运行的镜像
build Build an image from a Dockerfile # 通过Dockerfile定制镜像
commit Create a new image from a container changes #提交当前容器为新的镜像
cp Copy files/folders between a container and the local filesystem #从容器中拷贝到指定文件或目录到主机中
create Create a new container #创建一个新的容器
diff Inspect changes to files or directories on a container's filesystem #查看docker容器的变化
events Get real time events from the server # 从服务获取容器实时时间
exec Run a command in a running container # 在运行中的容器上运行命令
export Export a container's filesystem as a tar archive #导出容器文件系统作为一个tar归档文件[对应import]
history Show the history of an image # 展示一个镜像形成历史
images List images #列出系统当前的镜像
import Import the contents from a tarball to create a filesystem image #从tar包中导入内容创建一个文件系统镜像
info Display system-wide information # 显示全系统信息
inspect Return low-level information on Docker objects #查看容器详细信息
kill Kill one or more running containers # kill指定docker容器
load Load an image from a tar archive or STDIN #从一个tar包或标准输入中加载一个镜像[对应save]
login Log in to a Docker registry #注册或者登录一个docker源服务器
logout Log out from a Docker registry #从当前docker退出
logs Fetch the logs of a container #输出当前容器的信息
pause Pause all processes within one or more containers #暂停容器
port List port mappings or a specific mapping for the container #查看映射端口对应的容器内部源端
ps List containers #列出容器列表
pull Pull an image or a repository from a registry #从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to a registry #推送指定镜像或库镜像至docker源服务器
rename Rename a container
restart Restart one or more containers #重启运行的容器
rm Remove one or more containers #移除一个或者多个容器
rmi Remove one or more images #移除一个或多个镜像【无容器使用改镜像才可删除,否则需要删除相关内容器才可继续或 -f强制删除】
run Run a command in a new container #创建一个新的内容并运行一个命令
save Save one or more images to a tar archive (streamed to STDOUT by default) #保存一个镜像为一个tar包【对应 load】
search Search the Docker Hub for images #在docker hub 中搜索镜像
start Start one or more stopped containers #启动容器
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers #停止容器
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE #给源中的镜像打标签
top Display the running processes of a container #查看容器中的进程信息
unpause Unpause all processes within one or more containers #取消暂定的容器
update Update configuration of one or more containers
version Show the Docker version information #查看docker版本号
wait Block until one or more containers stop, then print their exit codes #截取容器停止的退出状态值
部署Nginx
#1.搜索镜像
[root@yuan ~]# docker search nginx
#2.拉取镜像
[root@yuan ~]# docker pull nginx
#3.查看镜像
[root@yuan ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 8.0.28 17b062d639f4 5 days ago 519MB
nginx latest 605c77e624dd 7 weeks ago 141MB
#4.启动运行
# -d 后台运行
# --name 给容器起名字
# -p 宿主机端口:容器内部端口 宝塔和阿里云需要开启3344端口
#不指定名称:docker run -d -p 3344:90 nginx
[root@yuan ~]# docker run -d --name nginx02 -p 3344:90 nginx
c6c57c393e08a1a6dea111540ef7d8022637cff1ec7734622733c5e8070316c3
#5.查看运行状态
[root@yuan ~]# docker ps
CONTAINER ID IMAGE COMMAND
c6c57c393e08 nginx "/docker-entrypoint.…"
#5.本机自测运行情况
[root@yuan ~]# curl localhost:3344
<!DOCTYPE html>
<html>
......
</body>
</html>
#进入配置
[root@yuan ~]# docker exec -it nginx02 /bin/bash
root@83953c538f77:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@83953c538f77:/# cd /etc/nginx
root@83953c538f77:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@83953c538f77:/etc/nginx# exit
exit
#停止nginx
[root@yuan ~]# docker ps
CONTAINER ID IMAGE COMMAND
83953c538f77 nginx "/docker-entrypoint.…"
[root@yuan ~]# docker stop 83953c538f77
83953c538f77
[root@yuan ~]#

部署Tomcat
# 官网推荐的安装方式:之前的启动都是后台,停止了容器,容器还是可以查到, docker run -it --rm 镜像名 一般是用来测试,用完就删除
[root@yuan ~]# docker run -it --rm tomcat:9.0
#安装tomcat最新版本的 docker pull tomcat:9.0 指定版本为9.0
[root@yuan ~]# docker pull tomcat
#查看镜像是否下载
[root@yuan ~]# docker images
#以后台方式,暴露端口方式,启动运行
# -d 后台运行
# --name 给容器起名字
# -p 宿主机端口:容器内部端口 宝塔和阿里云需要开启3355端口
#不指定名称:docker run -d -p 3355:8080 tomcat
docker run -d -p 3355:8080 --name tomcat01 tomcat
#查看运行状态
[root@yuan ~]# docker ps
CONTAINER ID IMAGE
5fb35759e29e tomcat
#本机自测运行情况404
#浏览器访问:http://宝塔公网id:3355/
[root@yuan ~]# curl localhost:3355
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style typ
#根据容器名称:tomcat01或id进入tomcat容器
[root@yuan ~]# docker exec -it tomcat01 /bin/bash
root@5fb35759e29e:/usr/local/tomcat# ls -l #查看tomcat容器内部内容:
total 160
-rw-r--r-- 1 root root 18994 Dec 2 22:01 BUILDING.txt
-rw-r--r-- 1 root root 6210 Dec 2 22:01 CONTRIBUTING.md
-rw-r--r-- 1 root root 60269 Dec 2 22:01 LICENSE
-rw-r--r-- 1 root root 2333 Dec 2 22:01 NOTICE
-rw-r--r-- 1 root root 3378 Dec 2 22:01 README.md
-rw-r--r-- 1 root root 6905 Dec 2 22:01 RELEASE-NOTES
-rw-r--r-- 1 root root 16517 Dec 2 22:01 RUNNING.txt
drwxr-xr-x 2 root root 4096 Dec 22 17:07 bin
drwxr-xr-x 1 root root 4096 Feb 24 09:30 conf
drwxr-xr-x 2 root root 4096 Dec 22 17:06 lib
drwxrwxrwx 1 root root 4096 Feb 24 09:30 logs
drwxr-xr-x 2 root root 4096 Dec 22 17:07 native-jni-lib
drwxrwxrwx 2 root root 4096 Dec 22 17:06 temp
drwxr-xr-x 2 root root 4096 Dec 22 17:06 webapps
drwxr-xr-x 7 root root 4096 Dec 2 22:01 webapps.dist
drwxrwxrwx 2 root root 4096 Dec 2 22:01 work
root@5fb35759e29e:/usr/local/tomcat# cd webapps
# 发现问题:1、linux命令少了。 2.webapps目录为空
# 原因:阿里云镜像的原因,阿里云默认是最小的镜像,所以不必要的都剔除掉
# 保证最小可运行的环境!
# 解决方案:
# 将webapps.dist下的文件都拷贝到webapps下即可
root@5fb35759e29e:/usr/local/tomcat/webapps# ls
root@5fb35759e29e:/usr/local/tomcat/webapps# cd ..
root@5fb35759e29e:/usr/local/tomcat# cp -r webapps.dist/* webapps #找到webapps.dist复制webapps下即可
root@5fb35759e29e:/usr/local/tomcat# cd webapps #进入webapps
root@5fb35759e29e:/usr/local/tomcat/webapps# ls #查看拷贝结果
ROOT docs examples host-manager manager
root@5fb35759e29e:/usr/local/tomcat/webapps#
#停止tomcat
[root@yuan ~]# docker stop 5fb35759e29e
5fb35759e29e

部署部署elasticsearch+kibana
# es 暴露的端口很多!
# es 十分耗内存
# es 的数据一般需要放置到安全目录!挂载
# --net somenetwork ? 网络配置
#docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
#安装并启动es,7.6.2版本
[root@yuan ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 测试一下es是否成功启动
[root@yuan ~]# curl localhost:9200
{
"name" : "2e7ddb9e066b",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "zq6j-OEESFuxAldeoqFWLw",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
# 查看docker容器使用内存情况
[root@yuan ~]# docker stats

#测试成功就关掉elasticSearch,可以添加内存的限制,修改配置文件 -e 环境配置修改 -Xms64m:指定64MB -Xmx512m:最大512MB
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
# 查看docker容器使用内存情况
[root@yuan ~]# docker stats

#测试
[root@yuan ~]# curl localhost:9200
{
"name" : "f02416879a5a",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "cuVPjNkCQ72pdlDPv-Q1pg",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
Portainer 可视化面板安装
# 安装命令
docker run -d -p 8081:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
测试外网访问:测试访问: 外网:8081 :http://外网Ip地址:8081/

登录成功

Docker镜像理解
Docker镜像
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来
如何得到镜像:
- 从远处仓库下载
- 朋友拷贝给你
- 自己制作一个镜像DockerFile
UnionFS(联合文件系统)
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
镜像加载原理
**bootfs(boot file system)**主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system),在bootfs之上。包含的就是典型 Linux 系统中的 /dev,/proc,/bin,/etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

平时我们安装虚拟机的centos都是好几个G,为什么Docker这里才200M?

对于一个精简的OS,rootfs 可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
虚拟机是分钟级别的,容器是秒级别的。
分层的镜像
我们去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载!

最大的好处,我觉得莫过于是资源共享了,比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留一份base镜像,同时内存中只需要加载一份base镜像,这样就可以为多有的容器服务了,而且每一层都可以被共享
查看镜像分层的方式可以通过docker image inspect 命令
[root@localhost ~]# docker image inspect redis:latest
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d",
"sha256:89ce1a07a7e4574d724ea605b4877f8a73542cf6abd3c8cbbd2668d911fa5353",
"sha256:9eef6e3cc2937e452b2325b227ca28120a70481be25404ed9aad27fa81219fd0",
"sha256:ee748697d275b904f1d5604345d70b647a8c145b9f05aeb5ca667e1f256e43d8",
"sha256:f1f7964d40afa49c6ef63ab11af91044e518a2539f567783ce997d3cea9ce8f6",
"sha256:3d9fda8ff875e549d54e9d7504ce17d27423fe27dafbb92127c603dddad7fa13"
]
},
理解:
所有的 Docker|镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于 Ubuntu Linux 16.04 创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加 Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含 3 个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。

在添加额外的镜像层的同时,镜像始终是保持当前所有镜像的组合,理解这一点是非常重要的。下图拒了一个简单的例子,每个镜像包含三个文件,而镜像包含了来自两个镜像层的6个文件。

上图中的镜像层和之前的图中略有区别,主要目的是便于展示文件
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层的文件7是文件5的一个更新版

这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。 Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系統。 Linux 上可用的存储引擎有 AUFS、Overlay2、Device Mapper、Btrfs 以及 ZFS。顾名思义,每种存储引擎都基于 Linux 中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker 在 Windows 上仅支持 windowsfiter一种存储引擎,该引擎基于 NTFS 文件系统之上实现了分层和 CoW[1]。
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合井,对外提供统一的视图。
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层

Commit镜像
docker commit 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
实战
#1、启动一个默认的tomcat
# 2、发现这个默认的tomcat是没有webapps应用,镜像的原因,官方的镜像默认webapps下面是没有文件的!
#3、拷贝进去了基本的文件,或者把webapps.dist拷贝到webapps
#4、将我们操作过的容器通过commit提交为一个镜像!我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像
[root@yuan ~]# docker commit -a="yuan" -m="add webapps app" f9e8dc883d5d tomcat02:1.0
sha256:992cf51e07e12a87e4a50e81065fbd5cc83d256ea7b707299a298579967a257e

如果你想要保存当前的状态,就通过commit提交,获得一个镜像,就好比我们以前学习VM时候,快照