docker简介
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的镜像,没有什么用,可以删除。
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