Docker学习笔记

 

 


镜像(image):
docker镜像就好比是一个目标,可以通过这个目标来创建容器服务,tomcat镜像==>run==>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的.
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个简易的 Linux系统。
仓库(repository):
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库。(很类似git)
Docker Hub是国外的。
阿里云…都有容器服务器(配置镜像加速!)

Linux要求内核3.0以上
uname -r 4.15.0-96-generic
# 要求3.0以上
cat /etc/os-release
帮助文档: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
#5、启动docker
docker systemctl start docker
#6. 使用docker version查看是否按照成功
docker version
#7. 测试
docker run hello-world

#8.查看一下下载的镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 4 months ago 13.3kB

#1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2. 删除资源
rm -rf /var/lib/docker
# /var/lib/docker 是docker的默认工作路径!

阿里云镜像加速

 


docker run 流程图.

Docker的常用命令

docker version #显示docker的版本信息。
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令

镜像命令
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替
docker search 搜索镜像
docker pull 下载镜像 docker image pull
docker rmi 删除镜像

容器命令
docker run 镜像id 新建容器并启动
docker run [可选参数] image | docker container run [可选参数] image
#参书说明
--name="Name" 容器名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080(宿主机):8080(容器)
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
- P(大写) 随机指定端口
# 测试、启动并进入容器
docker run -it centos /bin/bash
[root@95039813da8d /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@95039813da8d /]# exit #从容器退回主机

docker ps 列出所有运行的容器 docker container list
#docker ps命令 #列出当前正在运行的容器
-a, --all Show all containers (default shows just running)
-n, --last int Show n last created containers (includes all states) (default -1)
-q, --quiet Only display numeric IDs

exit ctrl+P +Q 容器不停止退出

docker rm 容器id 删除指定容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
docker rm -f $(docker ps -aq) #删除指定的容器
docker ps -a -q|xargs docker rm #删除所有的容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器


docker container | docker容器
Usage: docker container COMMAND | 用法:docker容器COMMAND
Manage containers | 管理容器
Commands:
attach 将本地标准输入、输出和错误流附加到正在运行的容器上。
commit 从容器的变化中创建一个新的图像。
cp 在容器和本地文件系统之间复制文件/文件夹。
create 创建一个新的容器
diff 检查容器的文件系统上的文件或目录的变化。
exec 在正在运行的容器中运行一个命令
export 将容器的文件系统导出为 tar 存档。
inspect 显示一个或多个容器的详细信息
kill 杀死一个或多个运行中的容器
logs 获取容器的日志
ls 容器清单
pause 暂停一个或多个容器内的所有进程
port 列出端口映射或容器的特定映射。
prune 移除所有停止的容器
rename 重新命名一个容器
restart 重新启动一个或多个容器
rm 移除一个或多个容器
run 在一个新的容器中运行一个命令
start 启动一个或多个停止的容器
stats 显示容器资源使用统计的实时流。
stop 停止一个或多个正在运行的容器
top 显示容器的运行进程
unpause 解除一个或多个容器内的所有进程。
update 更新一个或多个容器的配置
wait 阻止,直到一个或多个容器停止,然后打印其退出代码。
Run 'docker container COMMAND --help' for more information on a command.
运行'docker container COMMAND --help'以获取更多命令的信息。


其他常用命令
后台启动命令
docker run -d centos
# 常见的坑,docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志
docker logs --help
Options:
--details Show extra details provided to logs
* -f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
* --tail string Number of lines to show from the end of the logs (default "all")
* -t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #模拟日志
#显示日志
-tf #显示日志信息(一直更新)
--tail number #需要显示日志条数
docker logs -t --tail n 容器id #查看n行日志
docker logs -ft 容器id #跟着日志

查看镜像的元数据
docker inspect 容器id

进入当前正在运行的容器
docker exec -it 容器id bashshell
# 方式二
docker attach 容器id
#测试
docker attach 55321bcae33d
#docker exec #进入当前容器后开启一个新的终端,可以在里面操作。(常用)
#docker attach # 进入容器正在执行的终端

从主机把容器内容拷贝出来
docker cp 容器id:容器内路径 主机目的路径
#进入docker容器内部
docker exec -it 55321bcae33d /bin/bash
#新建一个文件
[root@55321bcae33d /]# echo "hello" > java.java
[root@55321bcae33d /]# cat java.java
hello
[root@55321bcae33d /]# exit
docker cp 55321bcae33d:/java.java / #拷贝
cd /
ls #可以看见java.java存在

 

Docker 安装 一个nginx
docker images
docker search nginx
docker pull nginx
docker run -it nginx /bin/bash
docker run -d --name nginx01 -p:3344:80 nginx
docker ps
curl localhost:3344
测试通过
进入容器
docker exec -it nginx01 /bin/bash
whereis nginx
exit
docker ps
docker stop nainx01
docker start nainx01
思考问题:每次改动nginx配置文件,都需要进入容器内部?十分的麻烦,我们可以在容器外部提供一个映射路径 -v数据卷


Docker 安装 一个tomcat
docker run -it -rm tomcat:9.0
#之前的启动都是在后台,停止了容器之后,容器还是可以查到 -rm 一般用来测试,用完即删除
docker run -d -p 3355:8080 --name tomcat01 tomcat
测试访问没问题
#进入容器
docker exec -it tomcat01 /bin/bash
#发现问题:linux命令少了,2没有webapps 因为默认下的镜像是阉割版
#保证最小可运行环境
cp webapps.dist/* webapps -r
#再刷新网页即可看到正常界面
#提供一个映射路径,webapps 在外部放置项目,就自动同步到内部就好了!


部署es+kibana
#elasticsearch
#es 暴露的端口很多
#es 十分的耗内存
#es 的数据一般需要放置到安全目录!挂载
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

启动以后,发现很卡。

docker stats 查看资源使用情况

curl localhost:9200 发现启动成功了

增加内存限制:

 docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

启动明显比刚才快了 

docker stats 查看资源使用情况

  

可视化

portainer(先用这个)

Docker图形化管理工具,提供一个后台面板

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

 

Docker镜像

Docker 轻量级、可执行的独立软件包

 UnionFS联合文件系统

bootfs (bootloader+kernel) bootloader主要是引导加载kernel,加载到内存中后也会卸载bootfs

rootfs包含/dev/proc/bin/etc等文件系统 rootfs也就是不同的操作系统发行版,比如Ubuntu Centos

 

分层理解

docker pull redis

发现有部分已存在

docker image inspect redis:latest

RootFS里面可以看到分层

 

commit镜像

docker commit提交容器称为一个新副本

docker commit -m="提交的描述信息" -a ="作者" 容器id 目标镜像名: [TGA]

docker start tomcat01

#启动一个tomcat 并且拷贝webapps

docker commit -a="yyqtj" -m="add webapps apo" 779a9381054f tomcat02:1.0

#生成一个镜像

docker images 发现有一个新版本,以后要用直接启动就行。

 

容器数据卷

将本地的路径挂载到容器中,保持数据持久化。也可以多容器共享一个目录,进行同步。

总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的。

使用数据卷:

方式一:直接使用命令来挂载 -v

docker run -it -v 主机目录,容器内目录

docker run -it -v /home/ceshi:/home centos /bin/bash

mkdir /home/test1

退出容器

ls /home/ceshi/

发现多出了目录和文件

docker inspect 271d93a739c2

查看容器信息,可以看到对应的信息

"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",  #主机地址
"Destination": "/home",    #容器地址
"Mode": "",
"RW": true,      #权限是读写
"Propagation": "rprivate"
}
],

 

docker start 271d93a739c2

 docker attach 271d93a739c2

ls #查看发现是共享数据卷的

 

安装mysql

mysql数据持久化问题

docker pull mysql:5.7

运行容器的时候进行挂载 ,并且配置密码

 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=password --name mysql01 mysql:5.7

-d 后台运行

-p 端口映射

-v 数据卷挂载

-e 环境配置

--name 容器名字

在第三方工具创建test库

ls  /home/mysql/data发现多出来test目录

 

docker rm -f mysql01   #删除mysql01

ls  /home/mysql/data 本地数据依然存在,实现数据持久化。

 

具名和匿名挂载

# 匿名挂载

-v 直接写容器内路径,不写本地路径

docker run -d -P --name nginx01 -v /etc/nagix nginx

docker volume --help

 create 创建卷

 inspect 查看卷

 ls 查看所有卷

 prune 移除没使用的

 rm 移除

docker volume ls

DRIVER VOLUME NAME
local db90cd21383452bde0c7427a55f5ee70f63d1e6698689012300ce8a59c9a18e8

local fe3c68983078b60558b393275f54d7ab3433fbb83df83717de1c4696492de17c

#发现有生成的卷 是生成的乱码

 

#具名

docker run -d -P --name nagix03 -v juming-nginx:/etc/nginx nginx

docker volume ls

DRIVER VOLUME NAME
local db90cd21383452bde0c7427a55f5ee70f63d1e6698689012300ce8a59c9a18e8
local fe3c68983078b60558b393275f54d7ab3433fbb83df83717de1c4696492de17c
local juming-nginx

#发现多出来的具名挂载’

 

#查看一下这个卷

[root@VM-0-4-centos data]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-09-27T23:22:36+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",   
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]

所有docker容器内的卷,没有指定目录的情况下都会在/var/lib/docker/volumes/xxxx

#如何确定是具名挂载还是匿名挂载,还是指定路径挂载!

-v 容器内路径 #匿名挂载

-v 卷名:容器内路径    #具名挂载

-v /宿主机路径::容器内路径 #指定路径挂载

扩展:

docker run -d -P --name nagix04 -v juming-nginx:/etc/nginx:ro nginx

#通过 -v 容器内路径:ro rw改编读写权限

ro readonly #只读 容器没权限,只能通过宿主机改变

rw readwrite #可读可写 

  

初识DockerFile

Dockerrfile就是用来构建docker镜像的构建文件!命令脚本

 方式二 

写个脚本,创建个镜像。

cd /home && mkdir docker-test-volume && cd docker-test-volume && vi dockerfile1

FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---end---"
CMD /bin/bash

#每个命令都是一层

 

docker build -f /home/docker-test-volume/dockerfile1 -t yyqbu -t centos .

Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 0d120b6ccaa8
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 3e5358ccf919
Removing intermediate container 3e5358ccf919
---> 0289b768be66
Step 3/4 : CMD echo "---end---"
---> Running in 246b31d2bc0f
Removing intermediate container 246b31d2bc0f
---> 21e829d5eb1f
Step 4/4 : CMD /bin/bash
---> Running in 4c159a2a52d0
Removing intermediate container 4c159a2a52d0
---> cf791219b974
Successfully built cf791219b974
Successfully tagged yyqbu:latest
Successfully tagged centos:latest

 

查找刚才生成的镜像并启动

docker images

docker run -it cf791219b974 /bin/bash 

ls -l

……

drwxr-xr-x 20 root root 4096 Aug 9 21:40 var
drwxr-xr-x 2 root root 4096 Sep 27 15:39 volume01
drwxr-xr-x 2 root root 4096 Sep 27 15:39 volume02

发现生成镜像自动挂载的数据卷目录,这个卷一定在外面有个同步的目录

 docker inspect e633b6e434d2 可以看到匿名挂载的卷,可以看到宿主机对应的目录

 

数据卷容器

两个mysql同步数据

两个或多个容器实现数据共享

#启动3个容器

docker run -it --name docker01 yyqbu

docker run -it --name docker02 --volumes-from docker01 yyqbu

touch /volume01/docker01 #在docker01上

ls /volume01/ #在docker02上 发现是同步的 

docker run -it --name docker03 --volumes-from docker01 yyqbu

touch /volume01/docker03 #在docker03上

ls /volume01/ #在docker01上发现在docker03上创建的也是同步的 

docker rm -f 216bc2a15265 #删除docker01的容器,数据卷数据还会有吗?

ls /volume01/ #在docker02上发现数据依然在

  

多个mysql实现数据共享

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=password --name mysql01 mysql:5.7

docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=password --name mysql02 --volumes-from mysql01 mysql:5.7

#这个时候可以实现两个容器数据同步

  

DockerFile的指令

FROM  #镜像基础,一切从这里开始

MAINTANER #镜像是读写的,姓名+邮箱

RUN #镜像构建的时候需要执行的命令

ADD #步骤,touch镜像,这个tomcat压缩包 添加内容

WORKDIR #镜像的工作目录

VOLUME #设置挂载的目录

EXPOST #暴露端口

 CMD #指定容器启动的时候需要执行的命令,只有最后一个生效

ENTRYPOINT #指定容器启动的时候要执行的命令,可以追加命令

ONBUILD #当构建一个被继承DockerFile这个时候就会运行 ONBUILD 的指令,触发指令。

COPY #类似ADD,将我们文件拷贝到镜像中

ENV #构建的时候设置环境变量

 

实战测试

1、编写DockerFile的文件

[root@VM-0-4-centos dockerfile]# vim mydockerfile

FROM centos
MAINTAINER yyq<13439629295@139.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash

2、通过这个文件构建文件

docker build -f mydockerfile -t mycentos:0.1 .

3、验证

docker run -it mycentos:0.1

pwd 

ifconfig

vim 1

exit

查看Docker镜像历史

docker history mycentos:0.1

  

发布自己的镜像:

1、发布到DockerHub

地址 https://hub.docker.com 注册自己的账号

docker login -u yangyq326

docker tag a6b9bbbed46f yangyq/tomcat:1.0 #( 必须要先做tag 才能push)

docker push yangyq/tomcat:1.0   #(由于默认配置可以直接push,如果是阿里需要写域名或者改配置)

 

2、发布到阿里云

 (1)登录阿里云

 (2)找到容器镜像服务

 (3)创建命令空间(push的时候用到)

 (4)创建容器镜像

$ sudo docker login --username=13439629295@163.com registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/yyq-test/yyq_test:[镜像版本号] (注意yyq-test是命令空间)
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/yyq-test/yyq_test:[镜像版本号]

3、发布到腾讯云
登录之前在控制台添加IP白名单并生成登录认证,其他步骤和阿里云一样。



Docker网络

清理环境:
docker rm -f $(docker ps -aq)
docker rmi -f $(docker images -aq)

没跑docker之前 ip addr

  

启动tomcat01

docker run -d -P --name tomcat01 tomcat 

本机ip addr 多出了:

  

 一个是3678(本地的) 一个是3679 (tomcat01的)

查看tomcat01 ip 

docker exec -it tomcat01 ip addr

发现是 3689: eth0@if3678 

后面创建 tomcat02 03  号是排着的,每个docker两个号,IP也是按照网关排着的,桥接模式,使用的evth-pair技术

docker run -d -P --name tomcat02 tomcat

docker exec -it tomcat02 ping 172.17.0.2 

tomcat02 ping tomcat01的ip可以通,但是通过主机名tomcat01不能通

 

Docker使用主机名通信而非IP(底层还是IP)

--link (用的少了)

docker run -d -P --name tomcat03 --link tomcat02 tomcat

docker exec -it tomcat03 ping tomcat02

这样可以ping通主机名

查看docker网络

docker network ls

  

 查看桥接网络

docker inspect 1500a81056fe

 

 包含IP信息对应Docker等。

验证link

1、通过inspect 

docker ps

找到tomcat03 (因为刚才link到02了)

docker inspect c91b96b4d6b7

  

 2、通过hosts文件

docker exec -it tomcat03 cat /etc/hosts

  

可以发现多出了tomcat02的IP 解析出了DOCKER NAMES和CONTAINER ID (正常只有172.17.0.4)

  

部署Redis集群

创建网络

docker network create redis --subnet 172.38.0.0/16
docker network ls
docker inspect redis

添加创建配置文件(之后使用数据卷挂载)

for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

批量启动

for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done

进入redis-1

docker exec -it redis-1 /bin/sh

创建集群

redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

进入查看

redis-cli -c
cluster info
cluster nodes

查看集群状态

 

当前3主3从 

 

设置

set a b

 值在13上 13的从是14

停掉13 然后看是否从替代了主,并且查13的值是否到14上

docker stop redis-3

set a

cluster nodes

 

 

 

狂神说Java学习笔记 https://www.bilibili.com/video/BV1og4y1q7M4?p=1

docker官网:https://www.docker.com/

文档:https://docs.docker.com/

仓库:https://hub.docker.com/

posted @ 2020-10-12 00:00  一代肝帝  阅读(212)  评论(0编辑  收藏  举报