目录
2.运行私有库Registry,相当于本地有个私有Docker hub
3.案例演示创建一个新镜像,centos安装ifconfig命令
4.curl验证私服库上有什么镜像(虚拟机ip:192.168.31.215)
5.将新镜像zzyyubuntu:1.2修改符合私服规范的Tag
从docker hub上(阿里云加速器)拉取mysql镜像到本地标签为5.7
从docker hub上(阿里云加速器)拉取redis镜像到本地标签为6.0.8
将一个redis.conf文件模板拷贝进/app/redis目录下
** 使用redis6.0.8镜像创建容器(也叫运行镜像)**
一.docker简介
1.docker出现的缘由
解决了运行环境和配置问题的软件容器,
方便做持续集成并有助于整体发布的容器虚拟化技术。
2.容器与虚拟机比较
*传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
*容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
* 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
3.docker官网:
docker官网:http://www.docker.com
Docker Hub官网: https://hub.docker.com/
二.docker安装
前提说明
目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上,
要求系统为64位、Linux系统内核版本为 3.8以上,这里选用Centos7.x
uname -r cat /etc/redhat-release
1.docker的基本组成:
镜像(image)
容器(container)
仓库(repository)
Docker工作原理
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境
Docker平台架构图解(架构版)
Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。
2.CentOS7安装Docker
https://docs.docker.com/engine/install/centos/
1.卸载旧版本
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
2.yum安装gcc相关
yum -y install gcc
yum -y install gcc-c++
3.安装需要的软件包
yum install -y yum-utils
4.设置stable镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.更新yum软件包索引
yum makecache fast
6.安装DOCKER CE
yum -y install docker-ce docker-ce-cli containerd.io
7.启动docker
systemctl start docker
8.测试
docker version
docker run hello-world
3.阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vtozzi4l.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
三.Docker常用命令
1、帮助启动类命令
启动docker: systemctl start docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help
2、镜像命令
列出本地主机上的镜像
docker images
-a :列出本地所有的镜像(含历史映像层)
-q :只显示镜像ID。
查询镜像
docker search [OPTIONS] 镜像名字
docker search --limit 5 redis --limit : 只列出N个镜像,默认25个
下载镜像
docker pull 镜像名字[:TAG]
查看镜像/容器/数据卷所占的空间
docker system df
删除镜像
docker rmi 某个XXX镜像名字ID
删除多个: docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部: docker rmi -f $(docker images -qa)
面试题:谈谈docker虚悬镜像是什么?
仓库名、标签都是<none>的镜像,俗称虚悬镜像dangling image
3、容器命令
有镜像才能创建容器,
docker pull centos
新建+启动容器
docker run [OPTIONS] images [COMMAND] [ARG...]
option:
--name="容器新名字"
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
也即启动交互式容器(前台有伪终端,等待交互);
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p
列出当前所有正在运行的容器
docker ps [OPTIONS]
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
退出容器
exit run进去容器,exit退出,容器停止
ctrl+p+q run进去容器,ctrl+p+q退出,容器不停止
启动已停止运行的容器
docker start 容器ID或者容器名
重启容器
docker restart 容器ID或者容器名
停止容器
docker stop 容器ID或者容器名
强制停止容器
docker kill 容器ID或容器名
删除已停止的容器
docker rm 容器ID
一次性删除多个容器实例
docker rm -f $(docker ps -a -q) docker ps -a -q | xargs docker rm
查看容器日志
docker logs 容器ID
查看容器内运行的进程
docker top 容器ID
查看容器内部细节
docker inspect 容器ID
进入正在运行的容器并以命令行交互
docker exec -it 容器ID /bin/bash
重新进入docker attach 容器ID
上述两个区别:
attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。
从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
导入和导出容器
export 导出容器的内容留作为一个tar归档文件[对应import命令]
import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
attach Attach 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 from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container # 创建一个新的容器,同 run,但不启动容器
diff Inspect changes on a container's filesystem # 查看 docker 容器变化
events Get real time events from the server # 从 docker 服务获取容器实时事件
exec Run a command in an existing container # 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history Show the history of an image # 展示一个镜像形成历史
images List images # 列出系统当前镜像
import Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]
info Display system-wide information # 显示系统相关信息
inspect Return low-level information on a container # 查看容器详细信息
kill Kill a running container # kill 指定 docker 容器
load Load an image from a tar archive # 从一个 tar 包中加载一个镜像[对应 save]
login Register or Login to the docker registry server # 注册或者登陆一个 docker 源服务器
logout Log out from a Docker registry server # 从当前 Docker registry 退出
logs Fetch the logs of a container # 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口对应的容器内部源端口
pause Pause all processes within a container # 暂停容器
ps List containers # 列出容器列表
pull Pull an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器
restart Restart a running container # 重启运行的容器
rm Remove one or more containers # 移除一个或者多个容器
rmi Remove one or more images # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run Run a command in a new container # 创建一个新的容器并运行一个命令
save Save an image to a tar archive # 保存一个镜像为一个 tar 包[对应 load]
search Search for an image on the Docker Hub # 在 docker hub 中搜索镜像
start Start a stopped containers # 启动容器
stop Stop a running containers # 停止容器
tag Tag an image into a repository # 给源中镜像打标签
top Lookup the running processes of a container # 查看容器中运行的进程信息
unpause Unpause a paused container # 取消暂停容器
version Show the docker version information # 查看 docker 版本号
wait Block until a container stops, then print its exit code # 截取容器停止时的退出状态值
四.Docker镜像
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
分层的镜像
UnionFS(联合文件系统)
是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。
为什么 Docker 镜像要采用这种分层结构呢
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
重点理解
Docker镜像层都是只读的,容器层是可写的
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的
Docker镜像commit操作案例
docker commit提交容器副本使之成为一个新的镜像
命令
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
五.本地镜像发布到阿里云
镜像的生成方法
基于当前容器创建一个新的镜像,新功能增强
docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
-a :提交的镜像作者;
-m :提交时的说明文字;
将本地镜像推送到阿里云
进入管理界面获得脚本
将镜像推送到阿里云registry
docker login --username=w**** registry.cn-qingdao.aliyuncs.com
docker push registry.cn-qingdao.aliyuncs.com/why_up/mycentos:1.3
将阿里云上的镜像下载到本地
docker pull registry.cn-qingdao.aliyuncs.com/why_up/mycentos:1.3
六.本地镜像发布到私有库
私有库:
1 官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。
2 Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。
Docker Registry是官方提供的工具,可以用于构建私有镜像仓库
将本地镜像推送到私有库
1.下载镜像Docker Registry
docker pull registry
2.运行私有库Registry,相当于本地有个私有Docker hub
docker run -d -p 5000:5000 -v /myregistry/:/tmp/registry --privileged=true registry
3.案例演示创建一个新镜像,centos安装ifconfig命令
从Hub上下载centos镜像到本地并成功运行
原始的centos镜像是不带着ifconfig命令的
外网连通的情况下,安装ifconfig命令并测试通过
yum -y insatll net-tools
安装完成后,commit我们自己的新镜像
公式:
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
docker commit -m='ifconfig add' -a="why" b92f9b8af29b myct02:1.2
4.curl验证私服库上有什么镜像(虚拟机ip:192.168.31.215)
curl -XGET http://192.168.31.215:5000/v2/_catalog
5.将新镜像zzyyubuntu:1.2修改符合私服规范的Tag
按照公式: docker tag 镜像:Tag
docker tag myct02:1.2 192.168.31.215:5000/myct02:1.2
6.修改配置文件使之支持http
vim命令新增如下内容:vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.31.215:5000"]
}
docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====> 修改完后如果不生效,建议重启docker
7.push推送到私服库
docker push 192.168.31.215:5000/myct02:1.2
8.curl验证私服库上有什么镜像2
curl -XGET http://192.168.31.215:5000/v2/_catalog
9.pull到本地并运行
docker pull 192.168.31.215:5000/myct02:1.2
启动验证ifconfig命令
七.Docker容器数据卷
注意事项
--privileged=true
Docker挂载主机目录访问如果出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可
如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。
功能:
* 将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接实时生效,爽
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
命令格式:
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
数据卷案例
宿主vs容器之间映射添加容器卷
直接命令添加 docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
查看数据卷是否挂载成功 docker inspect 容器ID
容器和宿主机之间数据共享
1 docker修改,主机同步获得
2 主机修改,docker同步获得
3 docker容器stop,主机修改,docker容器重启看数据是否同步
读写规则映射添加说明
读写(默认)
只读
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
卷的继承和共享
容器1完成和宿主机的映射
docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu
容器2继承容器1的卷规则
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
docker run -d --privileged=true --volumes-from u1 --name u2 ubuntu
八.Docker常规安装简介
8.1总体步骤
搜索镜像 拉取镜像 查看镜像 启动镜像 停止容器 移除容器
8.2安装tomcat
docker hub上面查找tomcat镜像
docker search tomcat
从docker hub上拉取tomcat镜像到本地
docker pull tomcat
docker images查看是否有拉取到的tomcat
docker images tomcat
使用tomcat镜像创建容器实例(也叫运行镜像)
docker run -it -p 8080:8080 tomcat
访问猫首页访问猫首页
问题
解决
1.可能没有映射端口或者没有关闭防火墙
2.把webapps.dist目录换成webapps
先启动Tomcat
docker exec -it tomcat bash
查看webapps 文件夹查看为空
免修改版说明
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
8.3安装mysql
docker hub上面查找mysql镜像
docker search mysql
从docker hub上(阿里云加速器)拉取mysql镜像到本地标签为5.7
docker pull mysql:5.7
使用mysql5.7镜像创建容器(简单版)有错误
使用mysql镜像
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d --name mysql57_1 mysql:5.7
docker ps
docker exec -it 容器ID /bin/bash
mysql -uroot -p
建库建表插入数据
外部Win10也来连接运行在dokcer上的mysql容器实例服务
问题
插入中文数据报错
字符集默认格式问题
SHOW VARIABLES LIKE 'character%'
实战版
新建mysql容器实例
docker run -d -p 3306:3306 --privileged=true -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql -v /mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7 --restart=always
新建my.cnf
cd /mysql/conf/
vim my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
重新启动mysql容器实例再重新进入并查看字符编码
再新建库新建表再插入中文测试
测试成功
结论
docker安装完MySQL并run出容器后,建议请先修改完字符集编码后再新建mysql库-表-插数据
假如将当前容器实例删除,再重新来一次,之前建的db01实例还有吗?trytry
安装redis
从docker hub上(阿里云加速器)拉取redis镜像到本地标签为6.0.8
docker pull redis:6.8
入门命令
命令提醒
容器卷记得加入--privileged=true
在CentOS宿主机下新建目录/app/redis
mkdir -p /app/redis
将一个redis.conf文件模板拷贝进/app/redis目录下
拷贝配置文件 将准备好的redis.conf文件放进/app/redis目录下
/app/redis目录下修改redis.conf文件
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 10
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events Ex
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
/app/redis目录下修改redis.conf文件
开启redis验证 可选
requirepass 123
允许redis外地连接 必须
注释掉 # bind 127.0.0.1
daemonize no
将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
开启redis数据持久化 appendonly yes 可选
** 使用redis6.0.8镜像创建容器(也叫运行镜像)**
docker run -p 6379:6379 --name myr3 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
测试redis-cli连接上来
docker exec -it 运行着Rediis服务的容器ID redis-cli
证明docker启动使用了我们自己指定的配置文件
修改前 我们用的配置文件,数据库默认是16个
修改后
宿主机的修改会同步给docker容器里面的配置。