目录
一、简介
1.1、docker是什么
- Docker是基于Go语言实现的云开源项目。
- Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
1.2、为什么要用docker
- docker有着比虚拟机更少的抽象层
- docker利用的时宿主机的内核,而不需要加载操作系统内核
二、安装docker
1、安装
# 1、安装gcc相关
yum -y install gcc
yum -y install gcc-c++
# 2、安装开发utils
yum install -y yum-utils
# 3、安装阿里云仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4、更新yum软件包索引
yum makecache fast
# 5、安装dockers engine
yum install -y docker-ce docker-ce-cli containerd.io
# 6、启动并设置开机自启动
systemctl start docker
systemctl enable docker
2、配置阿里云镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://aikv7hec.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3、测试
docker run hello-world # 运行
docker ps # 查看正在运行的容器
docker ps -a # 查看历史运行的容器
docker rm id # 删除容器
docker images # 查看所有镜像
docker rmi imageId # 删除镜像
三、操作命令
3.1、帮助命令
systemctl .... docker
start # 开启
stop # 停止
restart # 重启
status # 状态
enable # 开机自启
docker info
docker --help
docker xxx --help
3.2、镜像命令
# 1、搜索
docker search xx # 查询
docker search --limit 5 xx # 查询前5条
# 2、拉取
docker pull xx # 拉取最新
docker pull xx:version # 拉取对应版本
# 3、查看镜像
docker images
-a # 列出本地所有镜像
-q # 只显示镜像id
# 4、查看镜像/容器/数据卷所占空间
docker system df
# 5、删除
docker rmi xx # 删除
docker rmi -f xx # 强制删除
docker rmi `docker images -q` #强制删除所有
3.3、容器命令
1、运行
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
--name xx # 为容器指定一个名称
-d # 后台运行容器并返回容器id,也即启动守护式容器
-i # 交互模式运行容器,通常与-t使用
-t # 为容器分配一个伪输入终端,通常与-i使用
# 也即交互模式启动容器(前台有伪终端,等待交互)
-P # 指定端口映射---随机
-p # 指定端口映射---指定
-d # 后台守护式运行
# 测试:启动ubuntu并进入容器内部
docker run -it ubuntu /bin/bash
2、展示容器
docker ps # 列出运行中的容器
-a # 列出所有容器
-l # 显示最近创建
-n 5 # 显示最近5个
-q # 只显示id
3、退出容器
exit # 容器停止
ctrl+p+q #不停止退出
4、开关操作
docker start id/name # 启动已停止的容器
docker restart id/name # 重启
docker stop id/name # 停止
docker kill id/name # 强制停止
5、删除
docker rm id # 删除
docker rm -f id # 强制删除
docker rm -f $(docker ps -aq) #强制删除所有
6、查看容器信息
docker logs id # 查看日志
docker top id # 查看容器内运行的进程
docker inspect id # 查看容器内部细节
7、交互模式进入容器
docker exec -it id /bin/bash # exit退出不会停止容器
docker attach id # 会停止容器
# 进入redis服务
docke exec -it id redis-cli
8、从容器拷贝文件到主机
docker cp id:容器内路径 目的主机路径
9、导入导出容器
docker export id > xx.tar 导出为tar文件
cat xx.tar | docker import - 镜像用户/镜像名:镜像版本号 将tar转为容器对象
10、参考图片
四、镜像分层
Docker中的镜像分层,支持通过扩展原有镜像,创建新的镜像
案例:ubuntu里面无vim
1、更新包管理工具
apt-get update
apt-get install vim 安装
2、打包为新镜像
docker commit -m="提交信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
docker commit -m="vim cmd add ok" -a="laptoy" cid myubuntu:1.0
五、本地镜像推送到阿里云
1、阿里云镜像服务操作
1、进入个人实例
2、创建命名空间
3、创建镜像仓库
4、点击管理
2、实操
# 1、登录阿里云Docker Registry
docker login --username=la**** registry.cn-hangzhou.aliyuncs.com
# 2、push
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/laptoy/myubuntu:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/laptoy/myubuntu:[镜像版本号]
# 3、pull
docker pull registry.cn-hangzhou.aliyuncs.com/laptoy/myubuntu:[镜像版本号]
六、本地镜像推送到私有库
1、下载镜像Docker Registry
docker pull registry
2、运行docker私服库
docker run --name registry \
-p 5000:5000 \
-v /mydata/myregistry/:/tmp/registry \
--privileged=true \
-d registry
3、ubuntu安装ifconfig命令并打包(将容器打包为镜像)
apt-get update
apt-get install net-tools
docker commit -m="ifconfig add ok" -a="laptoy" cid myubuntu:1.0
4、验证私服库是否存在镜像
curl -XGET http://192.168.56.10:5000/v2/_catalog
5、将新镜像修改为符合私服规范的tag
docker tag 镜像:Tag Host:Port/Repository:Tag
docker tag myubuntu:1.0 192.168.56.10:5000/myubuntu:2.0
6、修改配置文件使其支持http
vi /etc/docker/daemon.json
加入,"insecure-registries":["ip:port"]到json串中 注意逗号
`重启docker`
7、推送到私服库
docker push 镜像名
docker push 192.168.56.10:5000/myubuntu:2.0
8、验证私服镜像列表
curl -XGET http://192.168.56.10:5000/v2/_catalog
9、拉到本地
docker pull Host:port/镜像:[Tag]
七、容器数据卷
1、设置root权限
Docker挂载如果出现cannot open directory.:Permission denied
挂载目录后加--privileged=true
,使用该参数,容器的root拥有真正的root权限
2、挂载目录
宿主机目录和容器目录互通互联(容器停止也会数据共享)
1、操作
-v 宿主机目录绝对路径:容器路径
2、测试
docker run -it --name myubuntu \
-v /mydata/ubuntu/tmp/host_data:/tmp/docker_data \
--privileged=true \
-d ubuntu \
3、查看挂载信息
docker inspect id
3、设置容器读写权限
1、默认容器内部为可读可写
-v 宿主机目录:容器路径:rw
2、设置容器只读
-v 宿主机目录:容器路径:ro
4、容器卷之间的继承(实际为复用-v指令)
宿主机和关联容器都实现数据共享
--volumes from 父容器
docker run -it --privileged --volumes from u1 --name u2 ubuntu
问:u1停止了,u2会怎么样?
答:u2扔和宿主机共享数据
u1启动后依旧有停止时u2和宿主机共享的数据
结论:–volumes from 仅实现挂载父类路径规则
八、安装常用软件(tomcat,mysql,redis,nginx)
设置容器自启动
docker update id --restart=always
8.1、tomcat
docker pull tomcat:7.0.70
docker run -d -p 8080:8080 --name tomcat tomcat:7.0.70
最新版tomcat10的webapps为空目录,需要把webapps删除,再将webapps.dist改为webapps
8.2、mysql
1、配置my.cnf解决字符编码问题
cd /mydata/mysql/conf
vi my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
2、运行容器
docker run -p 3306:3306 --name mysql \
--privileged=true \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
3、查看字符编码
mysql> SHOW VARIABLES LIKE 'character%';
8.3、Redis
1、拷贝一份redis.conf到宿主机目录
cp source [宿主机目录]
2、修改配置文件
2.1、禁用仅本地连接
# bind 127.0.0.1
2.2、关闭守护进程后台启动
daemonize no
2.3、关闭保护模式
protected-mode no
3、运行容器
docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
4、进入客户端
docker exec -it redis bash
redis-cli
8.4、Nginx
找一份nginx.conf
放在/mydata/nginx/conf
目录下
# 可以通过先运行一个nginx容器
docker run -p 80:80 --name nginx -d nginx:1.10
# 拷贝容器内的nginx.conf到宿主机目录
docker cp nginx:/etc/nginx/nginx.conf /mydata/nginx/conf
# 删除容器
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \ # 将宿主机目录挂载到容器内部目录
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-d nginx:1.10 # 后台运行容器,并返回容器ID;