docker 基本组成:
docker主机:安装docker程序的程序 docker是直接安装在操作系统上的
docker仓库:用来保存各种打包好的软件镜像 仓库分为公有仓库和私有仓库(类似maven)
docker镜像:软件打包好的镜像。镜像存放在仓库中
docker容器:镜像启动后的一个实例称之为容器 容器是独立运行的一个或者多个应用
docker command:
centos:
uname -r
uname -a
lscpu
内存:
free
free -h
磁盘:
fdisk -l
关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
上传下载:
yum -y install lrzsz
1.上传
鼠标拖拽
2.下载
a 下载一个文件
sz filename
b 下载多个文件
sz filename1 filename2
c 下载dir目录下的所有文件 不包含dir文件夹
sz dir/*
docker
前置条件:
yum install -y yum-utils device-mapper-persistent-data lvm2
添加源(国内镜像)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-
ce/linux/centos/docker-ce.repo
yum makecache fast
查看docker版本:
yum list docker-ce --showduplicates | sort -r
安装docker:
安装最新版:推荐大家安装最新版本
yum -y install docker-ce
安装指定版本:
语法规则:yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
yum -y install docker-ce-18.06.3.ce-3.el7 docker-ce-cli.x86_64
yum install -y docker-ce-19.03.9-3.el7 docker-ce-cli-19.03.9-3.el7
开启docker服务
systemctl start docker
systemctl status docker
安装阿里云镜像服务器:
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://复制自己的加速器地址.mirror.aliyuncs.com"] }
EOF
systemctl daemon-reload
systemctl restart docker
设置docker自启动
systemctl enable docker
docker信息:
docker -v
docker version
docker info
分类:
docker环境信息:
docker 【info|version】
容器生命周期管理:
docker 【create|exec|run|start|stop|restart|kill|rm|pause|unpause】
容器操作管理:
docker 【ps|inspect|top|attach|wait|export|port|rename|stat】
容器rootfs管理:
docker 【commit|cp|diff】
镜像仓库:
docker 【login|pull|push|search】
本地镜像管理:
docker 【build|images|rmi|tag|save|import|lao】
docker images
docker image ls
容器资源管理:
docker 【vulume|network】
系统日志信息:
docker 【events|history|logs】
docker:
pull:
docker pull repository:tag
docker pull ubuntu:20.04
images:
docker images
docker image ls
save:
docker save repository:tag -o repository:tage
o:output
docker save 仓库源:标签 -o 仓库源别名:标签别名
docker save ubuntu:20.04 -o ubuntu:20
docker save ubuntu:20.04 > ubuntu:20.1
load:
docker load -i repository:tag
i:input
docker load < repository:tag
search:
docker search tomcat
inspect:
docker inspect ubuntu:20.04
docker inspect -f {{.Size}} ubuntu:20.04
f:filter
history:
一个镜像是由多个层组成的 可以使用history查看由多少层
docker history ubuntu:20.04
tag:
标记本地镜像 将其归入某一仓库
docker tag ubuntu:20.04 ubuntu:20.1
类似快照
rmi:
docker rmi ubuntu:20.04
docker image rm ubuntu:20.04
docker rmi img_id
run:
docker 前端启动
docker run -it --rm -p 8080:8080 tomcat:9.01
ctl + c 退出运行 -p :指定端口:第一端口是宿主机端口 第二个是docker容器端口
第一个不能重复(端口冲突) 第二个不能修改
-it:interactive
docker 后端启动
docker run itd -p 8080:8080 tomcat:9.01
-d : detach(分离) --rm 与 -d是不能同时使用的
logs:
日志
docker logs -f name(tomcat)
查看容器名字:
docker ps
查看所有容器的名字:
docker ps -a
rm:
docker 删除容器
docker rm name
docker stop name
docker rf -f name 强制删除
docker ps -q 只显示正在运行的容器id
docker ps -qa 显示所有容器的id
停止运行所有的容器:
docker stop $(docker ps -qa)
停止运行正在运行的容器
docker stop $(docker ps -q)
删除所有的容器:
dcoker rm $(docker ps -qa)
删除所有的镜像
docker rm $(dokcer images -q)
查看所有的正在运行的容器:
docker ps -a
docker rm ${docker ps -qa}
创建一个容器
docker create -it --name tomcat -p 8080:8080 tomcat:9.01
docker ps -a 查看创建的docker是已经创建的状态
启动:
docker start container_id
进入容器:
exec:
先启动一个容器:
docker run -itd --name tomcat -p 8080:8080 tomcat:9.01
dcoekr exec -it tomcat /bin/bash
docekr exec -it taocmat sh
进入到内部之后 可以通过 cat /etc/issue 查看操作系统的内核版本
inspect:
docker inpsect image_id/container_id/container_name
kill:
docker kill container_id/container_name
杀掉正在运行中的容器
docker 安装niginx:
拉取镜像:
docker pull nginx:1.19.3-alpine
备份镜像:
docker save nginx:1.19.3-alpine -o nginx.1.19.3.alpine.tar
导入镜像:
docker load -i nginx.1.19.3.alpine.tar
运行镜像:
docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine
进入容器
docker exec -it nginx sh
查看html目录
cd /usr/share/nginx/html
配置文件目录
cat /etc/nginx/nginx.conf
docker 安装mysql:
拉取镜像:
docker pull mysql:5.7.31
备份镜像:
docekr save mysq:5.7.31 -o mysql.tar
导入镜像:
docekr load -i mysql.tar
运行镜像:
docker run -e 参数:
-e = --env 设置环境变量
例如:向my.cnf追加参数:
docker run -itd --name mysql --restart always --privileged=true -p 3306:3306
-e MYSQL_ROOT_PASSWORD=admin mysql:5.7.31 --character-set-server=utf8 --collation- server=utf8_general_ci
privileged参数:
可以不受限制的访问自己的系统调用
容器内测试mysql:
doceker exec -it mysql bash
登陆mysql
mysql -u root -p
use mysql;
show databases;
exit;
docker 安装zookeeper:
拉取镜像:
docker pull zookeeper:3.6.2
备份镜像:
docker save zookeeper:3.6.2 -o zookeeper.tar
导入镜像:
docker load -i zookeeper.tar
单机版:
docker run -itd --name zookeeper --restart always -p 2181:2181 zookeeper:3.6.2
dokcer exec -it zookeeper sh
cat /etc/issue
使用zooinsepctor查看
https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
进入到build目录下
运行jar文件
java -jar zookeeper-dev-ZooInspector.jar
docker 安装activermq:
拉取镜像:
docker pull webcenter/activemq:5.14.3
备份镜像:
docker save webcenter/activemq:5.14.3 -o acgtivemq.tar
导入镜像
docker load -i activemq.tar
单机版:
docker run -itd --name activmq --restart always -p 61616:61616 -p 8161:8161 webcenter/activemq:5.14.3
docker exec -it acivemq sh
cat /etc/issue
docker 核心原理:
云计算:
第一层次:底层的硬件资源(cpu 硬盘 网卡等)
第二层次:不需要关心硬件系统 操作系统装好 数据库装好 直接使用
第三层次:直接使用产品
对应的是laas paas saas
Laas:infrastrure-as-a-service :基础设施即服务 例如阿里云
Paas:platform-as-a-service:平台即服务 docker
Saas:sofeware-as-a-service:软件即服务 offiece github等
虚拟化:
如果说现在需要一台centos mysql 临时组装的话 就有点浪费时间
于是就有了各种软件平台 负责对资源的集中管理和快速调用
如果对资源进行管理 第一步就是虚拟化 虚拟化是云计算的基础
虚拟化就是一台物理机上 运行多台虚拟服务器 这种服务器机叫做虚拟机
从 表面看 多台虚拟机是单独的服务器 ,但是他们都是共享物理机的物理资源 只是通过模拟计算机的硬件 来实现运行多台计算机系统的技术。
物理机:宿主机
虚拟机:客户机
如何完成物理资源的虚拟化工作呢:hypervisor
hypervisor不是软件 是一类软件的统称 hypervisor 也称为vmm virtual marchine monitor 虚拟机监视器
它是运行在基础物理资源硬件之上的软件层 可以虚拟硬件资源
docker网络:
分为三种
docker安装后会自动创建三种网络:
bridge:(默认)
host:
none
命令:
docker network ls
理论部分:
docker使用Linux的桥接网卡 在宿主机上虚拟出一个docker0的虚拟网桥 docker启动一个容器时 就会根据docker网桥的的网段分配给容器一个ip地址 称为container-ip
同时docker网桥是每个容器的默认网关 docker网桥是宿主机虚拟出来的 并不是真实存在的网络设备 外部网络是无法寻址找到的 如果希望外部访问到 可以通过映射宿主机端口
即在run容器的时候 通过-P或者-p来指定端口。
使用docker info查看网络部分
network: Network: bridge host ipvlan macvlan null overlay
bridge网络:
bridge的表现形式就是docker0的网路接口 容器默认都是通过docker0网络通信的。
可以通过ip a命令查看
查看网络模式:
docker network ls
查看biridge模式
docker network inspect bridge
当我们启动一个容器时,bridge里containers就会有多一个元素
同时也会多一部分网卡
但是当我们启动容器之后 停止移除之后 此容器的ip就会重新分配 ip地址不固定
如果要指定一个网路模式 可以通过命令 --network host/bridge
docker创建网络:
docker network create -d(d:driver) 名称
注意 默认是birdge模式
docker network create -d bridge my-bridge
删除网络:
docker network rm 网络名称
查看网络内容:
docker network inspect 网络名称
启动指定网络:
docker run --network mybridge
lagou-network
172.172.0.0/24: 24代表子码掩码是255.255.255.0
172.172.0.0/16: 16 代表子码掩码
docker 数据卷:
原始数据copy:
cp命令:
宿主机文件复制到容器:
docker cp [options] src_path container:des_path
容器文件夹复制到宿主机:
docker cp [options] container:src_path des_path
数据卷:
可以将宿主机和容器进行直接的映射
需要通过run方式进行映射 如果使用create容器再指定 会很麻烦的
数据卷的三种类型:
宿主机数据卷:(推荐)
命名的数据卷:
匿名的数据卷:
数据卷挂载命令:
docker run -v /宿主机的绝对路径:容器内的目录 镜像名
通过 -v 容器内路径: ro rw 改变读写权限
ro:readonly 只读
rw:readwrite 可读可写
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
docker run -it -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
ro的权限只能是宿主机访问容器
docker挂在nexus3
https://hub.docker.com/r/sonatype/nexus3
拉取镜像:
docker pull sonatype/nexus3
备份镜像:
docker save sonatype/nexus3 -o nexus3
导入镜像:
docker load -i nexus3
运行镜像:
docker run -itd --name nexus3 sonatype/nexus3
进入镜像:
docker exec -it nexus3 sh
cd /nexus-data
cat admin.password
浏览器访问:
http://192.168.198.100:8081/
docker rm $(docker stop $(docker ps -aq))
重新挂载:
docker run -itd -p 8081:8081 --name nexus3 -v /data/nexus3/:/nexus-data/ sonatype/nexus3:3.28.1
docker logs -f nexus3
报错信息如下:
mkdir: cannot create directory '../sonatype-work/nexus3/log': Permission denied
docker rm -f nexus3
官方文档:授权
chown -R 200 nexus3/
docker run -d -p 8081:8081 --name nexus3 -v /data/nexus3/:/nexus-data/ sonatype/nexus3:3.28.1
查看容器启动日志
docker logs -f nexus3
命名数据卷:
docker run -itd --name nginx -p 80:80 -v lagouedu-nginx:/etc/nginx nginx:1.19.3- alpine
查看数据卷:
docker volume ls
查看具体的数据卷名称:
查看lagouedu-nginx宿主机目录
docker volume inspect lagouedu-nginx
找到宿主机的目录进入
匿名数据卷:
docker run -itd --name nginx -p 80:80 -v /etc/nginx nginx:1.19.3-alpine
docker volume ls
docker volume inspect dbd07daa4e40148b11....
cd /var/lib/docker/volumes/dbd07daa4e40148b11....
清理数据卷:
docekr volume prune
docker voluem ls
如果我们删除一个容器后 发现映射的数据卷缓存还在 可以使用删除命令进行清理 prune
数据卷容器:
如果用户需要在多个容器之间共享一些持续更新的数据 这个时候就需要使用数据卷容器
命令:
docker run --volumes-from
nginx1
nginx2
宿主机目录 数据卷容器(假设是centos)
mysql1
mysql2
第一步:
将centos和宿主机进行关联
docker run -d --name data-volume -v /data/nginx:/usr/share/nginx/html -v /data/mysql:/var/lib/mysql centos:7.8.2003
第二步:
将nginx和mysql和数据卷容器进行关联
docker run -itd --name nginx01 -p 80:80 --volumes-from data-volume nginx:1.19.3- alpine
echo "lagouedu nginx" > /data/nginx/index.html
http://192.168.198.100
docker run -itd --name nginx02 -p 81:80 --volumes-from data-volume nginx:1.19.3- alpine
http://192.168.198.100:81
docker run -itd --name mysql01 --restart always --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin --volumes-from data-volume mysql:5.7.31
-- character-set-server=utf8 --collation-server=utf8_general_ci
docker run -itd --name mysql02 --restart always --privileged=true -p 3307:3306 -e MYSQL_ROOT_PASSWORD=admin --volumes-from data-volume mysql:5.7.31
-- character-set-server=utf8 --collation-server=utf8_general_ci
docker-compose:
一个应用是多个微服务组成 因此 一个微服务就是一个容器 就需要多个容器一起执行 多个容器协同工作 compose就是容器的管理工具
compose可以简化容器的构建和运行
是为了定一个或多个容器运行和应用的工具
compose使用yaml来定义多个容器之间的关系。
一个docker-compose up就可以把所有的应用跑完
docker-compose的安装:
下载:
https://github.com/docker/compose
授权:
mv /data/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
cp /data/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
chmod 777 /usr/local/bin/docker-compose
docker-compose的安装版本:
docker-compose -v
docker-compose --version
docker-compose version
卸载docker-compose:
rm -rf /usr/local/bin/docker-compose
reboot
docker-compose默认使用docker-compose.yml 也可以通过使用-f参数指定具体文件
docker-compose包含四个一级key:
version:并非指的是compose或者docker引擎的版本
services:定义不同的应用服务
networks:指引网络服务
volumes:创建卷
安装docker私服:
官方私服地址:
https://hub.docker.com/_/registry
拉取镜像:
docker pull registry:2.7.1
备份镜像:
docker save registry:2.7.1 -o registry.2.7.1.tar
加载镜像:
docker load -i registry.2.7.1.tar
运行镜像:
docker run -itd -p 5000:5000 --name registry --restart=always registry:2.7.1
添加私服地址:
编辑配置文件
vi /etc/docker/daemon.json
增加仓库配置信息
{ "insecure-registries":["192.168.198.101:5000"] }
重启docker:
systemctl daemon-reload
systemctl restart docker
查看docker是否添加:
docker info
浏览器测试:
http://192.168.198.101:5000/v2/_catalog
上传镜像:
doceker tag nginx:1.2 192.1.68.2:5000/nginx:v1
docker push 192.1.68.2:5000/nginx:v1
浏览器测试:
http://192.168.198.101:5000/v2/nginx/tags/list
企业私服:
harbor官网地址: https://goharbor.io/ github
官网地址: https://github.com/goharbor/harbor
官方帮助文档: https://github.com/goharbor/harbor/blob/v1.9.4/docs/installation_guide.md
验证docker-compose
docker-compose -v
开发环境使用的http 但是生产使用的是https
1.解压软件
cd /data
tar zxf harbor-offline-installer-v1.9.4.tgz
2.进入目录:
cd harbor
3.修改配置文件
vi harbor.yml
3.1修改私服镜像地址 hostname: 192.168.198.101
3.2修改镜像地址访问端口号 port: 5000
3.3harbor管理员登录系统密码 harbor_admin_password: Harbor12345
3.4修改harbor映射卷目录 data_volume: /data/harbor
4.安装harbor
4.1执行启动脚本,经过下述3个步骤后,成功安装harbor私服 ./install.sh
4.2准备安装环境:检查docker版本和docker-compose版本
4.3加载harbor需要的镜像
4.4准备编译环境
4.5启动harbor。通过docker-compose方式启动服务
4.6google浏览器访问harbor私服 http://192.168.198.101:5000 username: admin password: Harbor12345
5.配置私服:
vi /etc/docker/daemon.json
"insecure-registries":["192.168.198.101:5000"]
重启docker服务:
systemctl daemon-reload
systemctl restart docker
新建项目:
在harbor中新建公共项目:
laogouedu
登陆私服:
docker login -u admin -p Harbor12345 192.168.198.101:5000
退出:
docker logout 192.168.198.101:5000
上传nginx:
docker tag mariadb:10.5.2 192.168.198.101:5000/lagouedu/nginx:1.19.3-alpine
docker push 192.168.198.101:5000/lagouedu/nginx:1.19.3-alpine
docker pull 192.168.198.101:5000/lagouedu/mariadb:10.5.2