安装教程:(https://docs.docker.com/engine/install/centos/)
文档(十分详细):(https://docs.docker.com/)
仓库地址:(https://hub.docker.com/signup)
Docker的出现。
一款产品有两个环境:开发和上线
发布以一个项目(jar+(redis,mysql,jdk,es,hadoop)),项目不能带上环境打包。环境配置麻烦,不能跨平台。
开发打包部署上线,一套流程做完。
Java —jar(环境)—打包项目带上环境(镜像)—(docker仓库:商店)—下载我们发布的镜像,直接运行即可
Docker给以上的问题提出了解决方案!
Docker通过隔离机制,隔离不同的应用,可以将服务器利用到极致!
1.受欢迎的原因:十分轻巧
在容器技术出现之前都是使用虚拟机技术
虚拟机:使用一个软件,通过这个软件可以虚拟出来一台或者多台电脑。
docker容器技术,也是一种虚拟化技术。
容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机的不同:
应用更快的交付和部署
更快捷的审计和扩缩容
更简单的系统运维
更高效的计算资源利用
Docker时内核级别的虚拟化,可以在一个物理机上运行很多的容器实例,服务器的性能可以被压榨到极致!
镜像:
一个docker镜像好比一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run===>tomcat01容器(提供服务器)
通过这个镜像看可以创建多个容器(最终服务运行或者运行就是在容器中的)。
仓库:
就是存放镜像的地方。仓库分为共有仓库和私有仓库。DockerHub(默认时国外的)
阿里云。。。都有容器容器服务(可以配置镜像加速!)
容器:
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个建议的Linux系统
1.环境准备:
2.环境查看
系统内核:
[root@iZ2zehsabv9z6btgwpsyhgZ ~]# uname -r
3.10.0-957.21.3.el7.x86_64
系统版本:
[root@iZ2zehsabv9z6btgwpsyhgZ ~]# 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. 更新docker软件包的索引
yum makecache fast
#5. 安装docker引擎-docker-ce是社区,ee是企业版
yum install docker-ce docker-ce-cli containerd.io
#6.启动docker
systemctl start docker
#7查看是否安装成功
docker version
#8.测试hello-world
docker run hello-world
#9.查看dockers下载的holle world镜像
docker images
#[root@iZ2zehsabv9z6btgwpsyhgZ ~]# docker images
#REPOSITORY TAG IMAGE ID CREATED SIZE
#redis latest aa4d65e670d6 10 days ago 105MB
#hello-world latest d1165f221234 5 months ago 13.3kB
了解:
#1.卸载docker依赖
yum remove docker-ce docker-ce-cli contain.io
#2.卸载docker环境资源
rm -rf /var/lib/docker
#/var/lib/docker 的docker默认资源路径
配置使用:4步
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://2qs6lhsp.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker是一个Client-server结构的系统,Docker的守护进程运行在主机上,通过socket客户端访问。
Docker Server接受到Docker-client的指令,就会执行这个命令
1.Docker有着比虚拟机更少的抽象层
2.docker利用的时宿主机的内核,vm需要的是Guest OS,分钟级别的启动,而docker是利用宿主机的操作系统,省略了这个复杂的过程,新建容器的过程是秒级的
docker version #显示docker 的版本信息
docker info #显示docker的系统信息 ,包括镜像和容器的数量
docker 命令 --help #万能命令
systemctl start docker #开启docker
systemmctl restart docker #重启docker
帮助文档地址:(https://docs.docker.com/reference/)
[root@iZ2zehsabv9z6btgwpsyhgZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest aa4d65e670d6 10 days ago 105MB
hello-world latest d1165f221234 5 months ago 13.3kB
#解释
REPOSITORY:镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像的id
CREATED:镜像的创建时间
SIZE:镜像的大小
#常用可选项
-a, --all #列出所有镜像
-q, --quiet #只显示镜像的id
2.docker search #搜索镜像的命令,和在dockerHub网页上搜索是一样的。
如: docker search mysql
#可选项
-f, --filter filter #过滤操作
#如:--filter=STARS=3000 这个搜索出来的镜像就是stars大于3000的
#[root@iZ2zehsabv9z6btgwpsyhgZ ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11205 [OK]
mariadb MariaDB Server is a high performing open sou… 4259 [OK]
3.docker pull 下载镜像
#docker pull 镜像名[:tag](指定版本,不然下载的都是最新版)
docker rmi 删除镜像
#删除指定镜像
[root@iZ2zehsabv9z6btgwpsyhgZ ~]# docker rmi -f 镜像id1
[root@iZ2zehsabv9z6btgwpsyhgZ ~]# docker rmi -f c60d96bd2b77
#批量删除镜像多个镜像
[root@iZ2zehsabv9z6btgwpsyhgZ ~]# docker rmi -f 镜像id1 镜像id2 镜像id3
[root@iZ2zehsabv9z6btgwpsyhgZ ~]# docker rmi -f $(docker images -aq) #删除所有镜像
说明:有了镜像才可以创建容器,Linux,下载一个centOS镜像来测试学习
docker pull centos
新建容器并启动
#参数说明
--name="Name" 容器名字 tomcat01 tomcat02,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
#启动并进入容器
[root@rookieWRL ~]# docker run -it centos /bin/bash #“rookieWRL”是我的服务器主机名
[root@7408b6254dde /]# #“7408b6254dde”是容器id
检验:
[root@rookieWRL ~]# docker run -it centos /bin/bash #启动容器
[root@3fcaef4607bc /]# [root@rookieWRL ~]# docker ps #查看当前在运行的容器(docker ps)需要切换到当前主机环境中才可以执行 -> 容器不停止退出(按ctrl+P+Q快捷键)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3fcaef4607bc centos "/bin/bash" 14 seconds ago Up 13 seconds inspiring_satoshi
[root@rookieWRL ~]# docker run -it centos /bin/bash
[root@ca140cb4cb87 /]# ls #查看容器内的centos 内部的centos和外部的没有任何关系,并且内部的centos有很多命令都不是完善的!
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
-a #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器
-q #只显示容器的id
1.exit #直接退出容器
2.ctrl+P+Q快捷键 #容器不停止退出
docker rm #删除删除一个或多个指定的容器 不能删除一个在运行的容器
docker rm -f #删通过 SIGKILL 信号强制删除一个运行中的容器。
docker rm $(docker ps -a -q) #删除所有已经停止的容器
docker ps -a -q|xargs docker rm #删除所有的容器
docker start #容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
# 命令 docker run -d 镜像名
docker run -d centos
**********
#问题:docker ps 发现centos 停止了
#常见的坑:docker容器使用后台运行,就必须要一个前要运行,docker 发现没有应用就会自动停止
#nignx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
命令:docker logs -tf --tail 容器id
#自己写一段shell脚本
docker run -d centos /bin.sh -c "while true;do echo rookieWRL;sleep 1;done"
#显示日志
-tf
--tail number(要显示的日志条数)
docker logs -tf --tail 10([日志条数]) 容器id
命令:dockers top 容器id
[root@rookieWRL ~]# docker top 6d3671f6e27b
UID PID PPID C STIME TTY
root 8099 8081 0 17:06 pts/0
命令:docker inspect 容器id
[root@rookieWRL ~]# docker inspect 6d3671f6e27
[
{
"Id": "6d3671f6e27b9f7725763d51dc081293de63ca834ee37ceaa83f354b01b87c8e",
"Created": "2021-08-04T09:06:51.976114719Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 8099,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-08-04T09:06:52.390489038Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
"ResolvConfPath": "/var/lib/docker/containers/6d3671f6e27b9f7725763d51dc081293de63ca834ee37ceaa83f354b01b87c8e/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/6d3671f6e27b9f7725763d51dc081293de63ca834ee37ceaa83f354b01b87c8e/hostname",
"HostsPath": "/var/lib/docker/containers/6d3671f6e27b9f7725763d51dc081293de63ca834ee37ceaa83f354b01b87c8e/hosts",
"LogPath": "/var/lib/docker/containers/6d3671f6e27b9f7725763d51dc081293de63ca834ee37ceaa83f354b01b87c8e/6d3671f6e27b9f7725763d51dc081293de63ca834ee37ceaa83f354b01b87c8e-json.log",
"Name": "/brave_haslett",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/8de9eeed955194496313f97bb0d54ba0c13f9787b8fae4e8ba1a07be03c014da-init/diff:/var/lib/docker/overlay2/e4b54ef4dd05eda469391646d67d0fbd65d2c38fc0bb46821737fd238ed66345/diff",
"MergedDir": "/var/lib/docker/overlay2/8de9eeed955194496313f97bb0d54ba0c13f9787b8fae4e8ba1a07be03c014da/merged",
"UpperDir": "/var/lib/docker/overlay2/8de9eeed955194496313f97bb0d54ba0c13f9787b8fae4e8ba1a07be03c014da/diff",
"WorkDir": "/var/lib/docker/overlay2/8de9eeed955194496313f97bb0d54ba0c13f9787b8fae4e8ba1a07be03c014da/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "6d3671f6e27b",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20201204",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "5e0af768a5e4a8493eb2dc9c889592eb89dea09ad3447ce0cb6528f5731ab39e",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/5e0af768a5e4",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "622da14a19c4f78294f0c7cb08870985bec3694ec56bdcdb1e0f63b4e4f0da27",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:03",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "52610b926c5e1219293b38a25dba6e1fe3ceb26a0b26b6318f091a1e5617a171",
"EndpointID": "622da14a19c4f78294f0c7cb08870985bec3694ec56bdcdb1e0f63b4e4f0da27",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
}
}
]
#通常我们的容器都是i使用后台方式运行的,需要进入容器,修改一些配置
#命令
docker exec -it 容器id shell命令
[root@rookieWRL ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d3671f6e27b centos "/bin/bash" 16 minutes ago Up 16 minutes brave_haslett
3fcaef4607bc centos "/bin/bash" 2 hours ago Up 2 hours inspiring_satoshi
[root@rookieWRL ~]# docker exec -it 6d3671f6e27b /bin/bash
[root@6d3671f6e27b /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@6d3671f6e27b /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:06 pts/0 00:00:00 /bin/bash
root 16 0 0 09:23 pts/1 00:00:00 /bin/bash
root 31 16 0 09:24 pts/1 00:00:00 ps -ef
#方式二
命令:docker attach 容器id
正在执行当前代码
#docker exec 进入容器后并开启一个新的终端,可以在里面操作(常用)
#docker attach 进入容器正在执行的终端,不会启动新的进程
命令:docker cp 容器id:容器内路径 目的主机路径
[root@rookieWRL ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d3671f6e27b centos "/bin/bash" 21 minutes ago Up 21 minutes brave_haslett
3fcaef4607bc centos "/bin/bash" 2 hours ago Up 2 hours inspiring_satoshi
[root@rookieWRL ~]# docker attch 6d3671f6e27b
docker: 'attch' is not a docker command.
See 'docker --help'
[root@rookieWRL ~]# docker attach 6d3671f6e27b
[root@6d3671f6e27b /]# cd /home
[root@6d3671f6e27b home]# touch cpfile.txt
[root@6d3671f6e27b home]# ls
cpfile.txt
[root@6d3671f6e27b home]# exit
exit
[root@rookieWRL ~]# cd /home
[root@rookieWRL home]# ls
redis www
[root@rookieWRL home]# docker ps 6d3671f6e27b:/home/cpfile.txt/home
"docker ps" accepts no arguments.
See 'docker ps --help'.
Usage: docker ps [OPTIONS]
List containers
[root@rookieWRL home]# docker cp 6d3671f6e27b:/home/cpfile.txt/home
"docker cp" requires exactly 2 arguments.
See 'docker cp --help'.
Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Copy files/folders between a container and the local filesystem
[root@rookieWRL home]# docker cp 6d3671f6e27b:/home/cpfile.txt /home
[root@rookieWRL home]# ls
cpfile.txt redis www
#拷贝是一个手动过程,未来我们使用-v卷的技术可以实现,自动同步
#1.搜索镜像:
[root@rookieWRL ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 15262 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2054 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 815 [OK]
jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 228
linuxserver/nginx An Nginx container, brought to you by LinuxS… 150
tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 137 [OK]
jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager 127 [OK]
alfg/nginx-rtmp NGINX, nginx-rtmp-module and FFmpeg from sou… 103 [OK]
jasonrivers/nginx-rtmp Docker images to host RTMP streams using NGI… 92 [OK]
nginxdemos/hello NGINX webserver that serves a simple page co… 70 [OK]
privatebin/nginx-fpm-alpine PrivateBin running on an Nginx, php-fpm & Al… 56 [OK]
nginx/nginx-ingress NGINX and NGINX Plus Ingress Controllers fo… 55
nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 46
staticfloat/nginx-certbot Opinionated setup for automatic TLS certs lo… 24 [OK]
schmunk42/nginx-redirect A very simple container to redirect HTTP tra… 19 [OK]
nginx/nginx-prometheus-exporter NGINX Prometheus Exporter for NGINX and NGIN… 19
centos/nginx-112-centos7 Platform for running nginx 1.12 or building … 15
centos/nginx-18-centos7 Platform for running nginx 1.8 or building n… 13
raulr/nginx-wordpress Nginx front-end for the official wordpress:f… 13 [OK]
bitwarden/nginx The Bitwarden nginx web server acting as a r… 11
flashspys/nginx-static Super Lightweight Nginx Image 10 [OK]
mailu/nginx Mailu nginx frontend 9 [OK]
sophos/nginx-vts-exporter Simple server that scrapes Nginx vts stats a… 7 [OK]
ansibleplaybookbundle/nginx-apb An APB to deploy NGINX 2 [OK]
wodby/nginx Generic nginx 1 [OK]
#2.下载镜像:
[root@rookieWRL ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
33847f680f63: Already exists
dbb907d5159d: Pull complete
8a268f30c42a: Pull complete
b10cf527a02d: Pull complete
c90b090c213b: Pull complete
1f41b2f2bf94: Pull complete
Digest: sha256:8f335768880da6baf72b70c701002b45f4932acae8d574dedfddaf967fc3ac90
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
#3.查看镜像是否下载成功
[root@rookieWRL ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest aa4d65e670d6 12 days ago 105MB
nginx latest 08b152afcfae 13 days ago 133MB
hello-world latest d1165f221234 5 months ago 13.3kB
centos latest 300e315adb2f 7 months ago 209MB
#4.运行容器
-d 后台运行
--name 给容器命名
-p 宿主机端口,容器内端口映射
[root@rookieWRL ~]# docker run -d --name nginx01 -p 3344:80 nginx
4f5f39163906c9aeb09c8c829cb6f3a3af1ba874bc95830b6f1a2f1a4470e9c4
#5.查看正在运行的容器
[root@rookieWRL ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4f5f39163906 nginx "/docker-entrypoint.…" 8 seconds ago Up 7 seconds 0.0.0.0:3344->80/tcp nginx01
3fcaef4607bc centos "/bin/bash" 6 hours ago Up 6 hours inspiring_satoshi
#6测试接口-访问3344端口-curl命令可以直接在终端进行测试
[root@rookieWRL ~]# curl localhost:3344
#进入容器
[root@rookieWRL ~]# docker exec -it nginx01 /bin/bash
#查看nginx相关文件的位置
root@4f5f39163906:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
#查看nignx相关的配置文件
root@4f5f39163906:/# cd /etc/nginx
root@4f5f39163906:/etc/nginx# ls
conf.d mime.types nginx.conf uwsgi_params
fastcgi_params modules scgi_params
端口暴露的概念
怎么在容器外部修改容器内的nginx配置文件?–数据卷的技术
#官方启动方法:我们之前的启动都是是后台的,用完停止容器之后,容器还是可以查到的,docker run -it --rm 一般用来测试,用完及删除,用完这个容器就会删除这个容器
$ docker run -it --rm tomcat:9.0
#下载启动
docker pull tomcat
#启动tomcat
[root@rookieWRL ~]# docker run -d -p 3355:8080 --name tomcat01 tomcat
2e9abd39f97011c61310c19e2854db862c1b6ed44c43f30af673c69cb47496fb
#测试外部主机访问该tomcat
问题:没有网站,所以找不到页面
#进入容器
[root@rookieWRL ~]# docker exec -it tomcat01 /bin/bash
root@2e9abd39f970:/usr/local/tomcat# ls
BUILDING.txt NOTICE RUNNING.txt lib temp work
CONTRIBUTING.md README.md bin logs webapps
LICENSE RELEASE-NOTES conf native-jni-lib webapps.dist
root@2e9abd39f970:/usr/local/tomcat# ls -al
total 176
drwxr-xr-x 1 root root 4096 Jul 23 09:46 .
drwxr-xr-x 1 root root 4096 Aug 7 10:15 ..
-rw-r--r-- 1 root root 18949 Jun 28 08:46 BUILDING.txt
-rw-r--r-- 1 root root 6210 Jun 28 08:46 CONTRIBUTING.md
-rw-r--r-- 1 root root 57092 Jun 28 08:46 LICENSE
-rw-r--r-- 1 root root 2333 Jun 28 08:46 NOTICE
-rw-r--r-- 1 root root 3372 Jun 28 08:46 README.md
-rw-r--r-- 1 root root 6898 Jun 28 08:46 RELEASE-NOTES
-rw-r--r-- 1 root root 16507 Jun 28 08:46 RUNNING.txt
drwxr-xr-x 2 root root 4096 Jul 23 09:46 bin
drwxr-xr-x 1 root root 4096 Aug 7 10:15 conf
drwxr-xr-x 2 root root 4096 Jul 23 09:46 lib
drwxrwxrwx 1 root root 4096 Aug 7 10:15 logs
drwxr-xr-x 2 root root 4096 Jul 23 09:46 native-jni-lib
drwxrwxrwx 2 root root 4096 Jul 23 09:46 temp
drwxr-xr-x 2 root root 4096 Jul 23 09:46 webapps
drwxr-xr-x 7 root root 4096 Jun 28 08:46 webapps.dist
drwxrwxrwx 2 root root 4096 Jun 28 08:46 work
root@2e9abd39f970:/usr/local/tomcat# cd webapps
root@2e9abd39f970:/usr/local/tomcat/webapps# ls
root@2e9abd39f970:/usr/local/tomcat/webapps#
#发现问题:发现这个容器是被阉割过的
#1.Linux命令少了
#2.没有webapps。阿里云的原因,默认是最小的镜像,所以不必要的都去除了
#保证了最小的可运行环境
#进入webapps.dist文件夹,这个是它的输出目录 ,然后把里面的内容拷贝到webapps里面
root@2e9abd39f970:/usr/local/tomcat# cd webapps.dist
root@2e9abd39f970:/usr/local/tomcat/webapps.dist# ls
ROOT docs examples host-manager manager
root@2e9abd39f970:/usr/local/tomcat/webapps.dist# cd ..
root@2e9abd39f970:/usr/local/tomcat# cp webapps.dist/* webapps
cp: -r not specified; omitting directory 'webapps.dist/ROOT'
cp: -r not specified; omitting directory 'webapps.dist/docs'
cp: -r not specified; omitting directory 'webapps.dist/examples'
cp: -r not specified; omitting directory 'webapps.dist/host-manager'
cp: -r not specified; omitting directory 'webapps.dist/manager'
root@2e9abd39f970:/usr/local/tomcat# cd webapps
root@2e9abd39f970:/usr/local/tomcat/webapps# ls
root@2e9abd39f970:/usr/local/tomcat/webapps# cd ..
root@2e9abd39f970:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@2e9abd39f970:/usr/local/tomcat# cd webapps
root@2e9abd39f970:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
#拷贝过来之后就可以访问到了
怎么在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了?
#es暴露的接口很多!
#es十分耗内存
#es的一般数据需要放置到安全目录!挂载
#--net somenetwork 网络配置
#下载启动 elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#启动了Linux就会卡
docker stats ->查看cpu状态
#es十分耗内存
#测试es是否安装成功
[root@rookieWRL ~]# curl localhost:9200
{
"name" : "dc59c39551d1",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "pS9kjEM9T1aWYkED6SZy_Q",
"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"
}
#赶紧关闭es,增加内存的限制 ,修改配置文件 -e环境配置修改
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: Error response from daemon: Conflict. The container name "/elasticsearch" is already in use by container "dc59c39551d11c7a71e862347b8d17841452139f7d61f53051ada086d258e129". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
解决:表示这个名为“elasticsearch”的容器已经存在,我们取一个别的名字即可
[root@rookieWRL ~]# docker run -d --name elasticsearch03 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
82744712a58bd2d41a2ac14ec7b171f2d6f2d4b8a8b68c492800d490d922942e
docker: Error response from daemon: driver failed programming external connectivity on endpoint elasticsearch03 (79dae940d2e994c7d789b8789fb0b6c1b71d746bdc65c4e0bde88363b0f3004d): Bind for 0.0.0.0:9300 failed: port is already allocated.
解决:因该是有es容器占用了9300端口,我把正在运行的es容器停掉重新运行就好了
#重新配置后测试成功
[root@rookieWRL ~]# curl localhost:9200
{
"name" : "cded944be5f7",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "jCQIP0nGTKq_hfkxDVP73A",
"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"
}
使用kibana来连接es?
portainer(先用这个,不是最佳选择)
docker run -d -p 8088:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Rancher(CI/CD再用)
Docker图形化管理工具。提供一个后台面板给我们操作
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试:
外网:http://39.105.163.53:8088/
注册页面:
注册之后:
local
平时不会使用这个面板
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有应用直接打包docker镜像,就可以直接跑起来!
如何得到镜像:
1.从远程下载
2.朋友拷贝过来
3.自己制作一个镜像dockerFile
UnionFs(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统。它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下(unite serveral directories into a single virtual filesystem).Union文件系统是docker 镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS.
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,为什么到docke这里才几百M
对于一个精简的OS,rootfs很小,只需包含最基本的命令,工具和程序库就可以了,因为最底层直接使用host的kernel,自己只需要提供rootfs就可以了,由此可见对于不同的Linux发行版本,bootfs基本是一致的,rootfs会有差别,因此不同的发行版本可以公用bootfs.
分层的镜像
思考?为什么docker镜像要采用这种分层的结构呢?
最大的好处莫过于是资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有容器服务了,而且镜像的每一层都可以被共享。
查看镜像分层的方式可以通过docker imgae inspect命令!
理解:
所有的docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。举一个简单的例子。例如基于Ubuntu Linux16.04创建一个新的镜像,这就是新镜像的第一层,如果在该镜像中添加python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含三个镜像层,如下图:
在添加额外镜像蹭听的同时,镜像始终保持时当前所有镜像的组合,理解这一点十分重要,下图举了一个简单的例子,每个镜像层包含三个文件,二镜像包含了来自两个镜像层的6个文件。
上图的镜像层跟之前的略有区别,主要目的是便于展示文件。
下图展示另一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版
这种情况下,上层镜像层中的文件能覆盖了底层镜像层中的文件。这样就使得文件的更新本版作为一新的镜像层添加到镜像当中。Docker通过存储引擎(新版本采用快照机制)的方式实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux上可以用的存储引擎有AUFS,Overlay2,DeviceMapper,Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在windows上仅支持Windows filter一种存储引擎,该引擎基于NTFS文件系统之上是实现了分层和Cow[1]
下图展示 了与系统显示相同的三层镜像,所有镜像层堆叠并合并,对外提供统一的视图。
特点:
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下都叫镜像层
如何提交一个自己的镜像
docker commit 提交容器成为一个新的副本
#命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[版本]
实战测试:
1.启动一个默认的tomcat
2.发现这个默认的tomcat是 没有webapp应用,镜像的原因,官方的镜像默认,webapps下面是没有文件的
3.我们手动拷贝文件进去
4.将我们操作过的容器通过commit提交为一个镜像,我们以后就是用我们修改过的镜像即可。这就是我们自己的一个修改的镜像
到这才是入门docker
Volumes :数据卷(Volumes)存储在由 Docker 管理的主机文件系统的一个区域中(Linux上通常是/var/lib/docker/volumes/)。这部分文件系统是由 Docker 管理的,因此非 Docker 进程不应修改这部分文件系统。Volumes 是在 Docker 中持久化数据的最好方式。
Bind mounts:绑定挂载(Bind mounts)可以存储在主机系统的任何地方。它们甚至可以是重要的系统文件或目录。Docker 主机或 Docker 容器上的非 Docker 进程随时都可以修改它们。
tmpfs mounts: 临时文件系统挂载(tmpfs mounts)仅存储在主机系统的内存中,永远不会写入主机系统的文件系统中。
想要直观地理解 volume、绑定挂载(bind mount) 和 tmpfs 挂载之间的区别,可以考虑它们在Docker主机上的数据存储位置。
对于 volume,数据存储在 Docker 的存储系统中,由 Docker 自身管理。相反,绑定挂载是将主机的文件系统中的目录挂载到容器中,因此数据存储在主机上。此外,tmpfs 挂载类似于绑定挂载,但数据存储在内存中,而不是存储在主机文件系统上。
但无论使用哪种挂载类型,Docker 容器都能够像本地文件系统中的数据一样读取和写入数据。这确保了数据可以在容器之间或容器和主机系统之间轻松管理和共享。
绑定挂载(Bind mounts)自 Docker 的早期版本就已经存在了。与数据卷相比,绑定挂载的功能比较有限。当您使用绑定挂载时,会将主机机器上的某个文件或目录挂载到容器中。文件或目录由其在主机机器上的完整路径引用。该文件或目录不需要在 Docker 主机上事先存在。如果它尚不存在,则会按需创建。绑定挂载的性能非常良好,但它们依赖于主机机器的文件系统中有特定的目录结构可用。如果您正在开发新的 Docker 应用程序,建议使用命名卷(named volumes)来代替绑定挂载。您无法使用 Docker CLI 命令直接管理绑定挂载。
注意:绑定挂载(Bind mounts)可以通过在容器中运行的进程访问敏感文件
。
临时文件系统挂载(tmpfs mounts):在 Docker 主机或容器内部都不会将 tmpfs 挂载持久化到磁盘上。它可以在容器的生命周期内被容器使用,用于存储非持久化状态或敏感信息。例如,swarm 服务在内部使用 tmpfs 挂载将密钥挂载到服务的容器中。在使用 tmpfs 挂载时,需要注意不要将敏感信息存储在其中,因为一旦容器关闭,数据就会消失。
命名管道(named pipes):npipe 挂载可用于 Docker 主机和容器之间的通信。常见的用例是在容器内运行第三方工具,并使用命名管道连接到 Docker 引擎 API。命名管道可以提供一种简单的方法,使容器内部的进程能够与 Docker 主机进行通信,而不需要将敏感信息通过网络发送。
Volumes(数据卷)是由 Docker 创建和管理的。您可以使用 docker volume create 命令显式地创建数据卷,或者 Docker 可以在创建容器或服务时创建数据卷。
创建数据卷时,它会存储在 Docker 主机上的一个目录中。当您将数据卷添加到容器时,就会将这个目录挂载到容器内部。这类似于绑定挂载的工作方式,但是数据卷是由 Docker 管理的,与主机机器的核心功能隔离。
一个数据卷可以同时挂载到多个容器中。当没有任何正在使用某个数据卷的容器时,该数据卷仍然可供 Docker 使用,不会被自动删除。您可以使用 docker volume prune 命令来删除未使用的数据卷。
在挂载数据卷时,它可以有命名(named)或匿名(anonymous)。匿名数据卷在首次挂载到容器时不会被显式地命名,因此 Docker 会为它们分配一个随机的名称,该名称可以在给定的 Docker 主机内确保唯一。除了名称之外,命名和匿名数据卷的行为相同。
数据卷还支持使用卷驱动程序(volume drivers),这使您可以将其数据存储在远程主机或云服务提供商等位置。
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
在Docker中,容器可以通过挂载(volume)宿主机中的目录,来实现数据在容器和宿主机之间的共享。而绑定传播(bind propagation)则是指容器内的操作(新增、修改、删除)是否需要同步到宿主机上挂载的目录中,以及其他正在使用该volume的容器中。
在Docker中,使用volume的时候,有两种传播方式:
rprivate:表示volume仅在容器内有效,不会传播到宿主机或其他容器中。
rshared:表示volume会传播到其他所有与此volume挂载同一路径的容器中。
对于volume来说,只能使用rprivate传播方式,而bind propagation则无法配置。这是因为Docker认为,如此可以更好地隔离容器之间,保证数据安全。
–mount: 由多个键值对组成,以逗号分隔,每个键值对由一个=元组组成。语法–mount比-v或者–volume更冗长,但键的顺序并不重要,标志的值更容易理解。
挂载类型(type):可以选择bind、volume或tmpfs。这里是针对volumes进行讨论,因此类型永远为volume。
源(source):对于命名的volume,这里是volume的名称。对于匿名volume,则省略此字段。可以使用source或src指定。
目的地(destination):该字段指定容器内挂载文件或目录的路径。可以使用destination、dst或target指定。
只读选项(readonly):如果指定,将会以只读方式将bind挂载到容器中。可以使用readonly或ro指定。
volume-opt选项:可以指定多个key-value形式的选项名称和值,以此来指定volume的一些额外选项。
初识dockerfile
载镜像生成时就挂载
多个MySQL同步数据
参考阿里云文档
docker run -p 3306:3306 --name mysql
-v /data/docker/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=Vv0IBQ5qST
-d mysql:5.7
在容器技术中,每个容器都可以被看作是一个独立的进程,并且拥有自己的文件系统、网络、进程空间等资源。为了实现对容器的管理和控制,每个容器都有一个基础镜像(Base Image),该镜像包含了容器所需要的操作系统和应用程序环境。
当创建一个新的容器时,它会初始化一个可写层(Writeable Layer),它可以被看作是容器默认挂载的一个文件系统,用于在容器中保存所有的更改或修改。可写层的另一个作用是,使不同容器之间的修改相互隔离,从而保证每个容器的独立性和安全性。
可写层在容器中的作用类似于一个分层文件系统,容器的文件系统可以被看作由多个层次组成,每个层次包含了一个可写层和一个只读的基础镜像。当容器使用一个文件时,它首先在可写层中查找,如果不存在则会在只读层中查找。如果容器中有多个层次存在同名文件,则根据搜索层级的优先顺序,选择优先级最高的文件。
需要注意的是,每个可写层都是独立的,容器之间不共享可写层。当容器停止时,该层会被清理或销毁,任何修改都会丢失。为了保留对容器的修改或更改,用户需要使用Docker commit等命令将容器的状态保存为新的容器镜像,从而可以在以后的容器中使用该镜像。
启动redis服务
docker run -it -d \
-p 6650:6650 \
-p 8080:8080 \
-v $PWD/data:/pulsar/data \
apachepulsar/pulsar:latest \
bin/pulsar standalone
先copy出nats的配置文件,然后再挂载,因为无法进入到容器内部
[root@rookieWRL myNats3]# ls
nats1-server.conf
[root@rookieWRL myNats3]# docker run -d -it -p 4222:4222 -v $PWD/nats1-server.conf:/nats-server.conf nats:latest
docker run -d --name pg1 -p 5433:5432 -e POSTGRES_PASSWORD=wrl128201 -v D:/dockerVolumes/pg1:/var/lib/postgresql/data postgres