docker简介

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

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

docker组成:镜像、容器、仓库

Docker安装和使用

安装地址参考:https://docs.docker.com/engine/install/centos/

1.安装前提:

yum -y install gcc gcc-c++
yum install -y yum-utils
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 makecache fast

2.安装和启动

yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl start docker
ps -ef|grep docker

3.配置阿里云加速

登录阿里云账号-控制台-搜索-容器镜像服务-找到镜像工具-镜像加速,选择对应的操作系统,然后根据参考文档添加

mkdir -p /etc/docker

tee /etc/docker/daemon.json <<-'EOF'
{
 "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF

systemctl daemon-reload
systemctl restart docker

4.卸载方法

systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

5.常用命令

a.帮助启动类命令

启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker具体命令--help

b.镜像命令

docker images 列出本地主机上的镜像
 -a 列表本地所有镜像(含历史映像层)
 -q 只显示镜像ID

REPOSITORY:表示镜像的仓库源
TAG:镜像的标签版本号
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小

docker search 镜像名称 查找镜像命令
 --limit 只列出N个镜像,默认25个 例如:docker search --limit 5 redis

docker pull 镜像名称 拉取镜像
例如:
docker pull 镜像名字[:TAG] 没有TAG 等价于 docker pull 镜像名字:latest
 docker pull ubuntu
 docker pull redis:6.0.8

docker system df 查看镜像/容器/数据卷所占的空间
docker rmi 镜像名称或者镜像ID 删除镜像
 docker rmi -f 镜像ID 强制删除
 docker rmi 镜像名1:TAG 镜像名2:TAG ... 删除多个镜像
 docker rmi $(docker images -qa) 删除所有镜像

c.容器命令

docker run OPTIONS 运行容器
--name=”容器名称” 为容器指定一个名字
-d 后台运行容器并返回容器ID,即启动守护进程模式
-i 以交互模式运行容器 interactive,通常与-t同时使用
-t 为容器重新分配一个伪输入终端 tty,通常与-i同时使用
-P 随机端口映射 主机端口:容器端口
-p 指定端口映射,主机端口:容器端口 

docker ps 查看当前运行的容器实例
 -a 列出当前所有正在运行+历史运行过的容器
 -l 显示最近创建的容器
 -n 显示最近n个创建的容器
 -q 静默模式,只显示容器编号

退出容器:
1)输入exit或者ctrl+d 退出容器,容器会停止
2)按ctrl+p+q 退出,容器不会停止

启动已经停止运行的容器:docker start 容器ID或者容器名
重启容器:docker restart 容器ID或者容器名
停止容器:docker stop容器ID或者容器名
强制停止容器:docker kill容器ID或者容器名
删除已停止的容器:docker rm 容器ID (-f 强制删除,慎用)

docker run -d 容器名 #(守护进程)
docker logs 容器id #查看容器日志
docker ps #查看容器下运行的进程
docker inspect 容器ID #查看容器内部细节
docker exec -it 容器ID bash #进入容器 区别:是在容器中打开新的终端,并可以启动新的进程,用exit退出,不会导致容器停止。推荐使用,因为退出容器终端,不会退出容器。
docker attach 容器ID #进入容器 区别:直接进入容器启动命令的终端,不会启动新的进程,用exit停止,会导致容器的停止。
docker cp 容器ID:容器内路径 目的主机路径  #从容器内拷贝文件到主机上,例如:docker cp 9413919976da:/root/a.txt /tmp/

导入和导出容器
export 导出容器的内容流作为一个tar归档文件【对应import命令】
import 从tar包中的内容创建一个新的文件系统再导入镜像【对应export】

案例:
docker export 容器id > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
例如:
docker export 9413919976da > abcd.tar
cat abcd.tar | docker import - test/ubuntu:3.8
docker images
docker run -it 0e50c9370ff4 /bin/bash
docker exec -it 483de2097a78 /bin/bash

谈谈docker虚悬镜像是什么?

答:就是仓库名、标签都是none的镜像,没有什么用,可以删除。

img

Docker镜像

分层镜像

UnionFS联合文件系统

docker镜像加载原理

为什么docker镜像要采用这种分层结构?

重点理解
Docker镜像层是只读,只有容器层是可写

docker commit 提交容器副本使之成为一个新的镜像

docker commit -m=”提交的描述信息” -a=”作者” 容器ID 要创建的镜像名:[标签名]

实践:

[root@test102 ~]# docker run -it ubuntu bash
root@12818e24a30e:/# vim a.txt
bash: vim: command not found
apt-get update
apt-get -y install vim
root@12818e24a30e:/# vim a.txt
root@12818e24a30e:/# 
root@12818e24a30e:/# cat a.txt 
this is docker.
[root@test102 ~]# docker commit -m="add vim cmd" -a="fly" 12818e24a30e 仓库用户名/ubuntu:1.8
[root@test102 ~]# docker images
REPOSITORY   TAG    IMAGE ID    CREATED        SIZE
仓库用户名/ubuntu  1.8    3564146bfa1e  About a minute ago  180MB

本地镜像发布阿里云仓库

docker images
docker login --username=阿里云用户名 registry.cn-hangzhou.aliyuncs.com
docker tag 3564146bfa1e registry.cn-hangzhou.aliyuncs.com/fet/myubuntu:1.8
docker push registry.cn-hangzhou.aliyuncs.com/fet/myubuntu:1.8
docker images
docker rmi -f 3564146bfa1e 3564146bfa1e
docker images
docker pull registry.cn-hangzhou.aliyuncs.com/fet/myubuntu:1.8

搭建私有仓库

docker pull registry
docker run -d -p 5000:5000 -v /cangku/myregistry/:/tmp/registry --privileged=true registry 
docker run -it ubuntu /bin/bash

docker容器内执行上述两条命令:

apt-get update
apt-get install net-tools
docker ps
#查看镜像id,然后commit
docker commit -m="ifconfig cmd add" -a="fly" 196094bcf57a flyubuntu:1.2
docker images
#查看私有仓库
curl -XGET http://192.168.238.102:5000/v2/_catalog
#规范名称
docker tag flyubuntu:1.2 192.168.238.102:5000/flyubuntu:1.2

#修改配置文件使之支持http,别忘了上面一行要加个逗号
[root@test102 ~]# vi /etc/docker/daemon.json 
 "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"],
{
 "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"],
 "insecure-registries": ["192.168.238.102:5000"]
}

#重新reload docker
systemctl reload docker
#推送到私有仓库
docker push 192.168.238.102:5000/flyubuntu:1.2
#查看私有仓库是否存储
curl -XGET http://192.168.238.102:5000/v2/_catalog
#拉取本地
docker pull 192.168.238.102:5000/flyubuntu:1.2
docker run -it 镜像ID /bin/bash

Docker容器数据卷

#容器卷记得加入--privileged=true
#宿主机和容器之间添加映射卷
公式:docker run -it -v /宿主机目录:/容器内目录 ubuntu /bin/bash
docker run -it --name u2 --privileged=true -v /tmp/host_data/:/tmp/docker_data ubuntu /bin/bash
#容器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

安装tomcat

docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

安装mysql实战 注意密码后面不要多余空格,否则输入密码登录不了mysql

docker run -d -p 3306:3306 --privileged=true -v /opt/mysql/log:/var/log/mysql -v /opt/mysql/data:/var/lib/mysql -v /opt/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
#新建my.cnf,添加

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

安装redis

docker run -p 6379:6379 --name myr3 --privileged=true -v /opt/redis/redis.conf:/etc/redis/redis.conf -v /opt/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
docker run -p 6380:6380 --name myr4 --privileged=true -v /opt/redis_6380/redis.conf:/etc/redis/redis.conf -v /opt/redis_6380/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf