docker学习日志

本文详细介绍了如何在CentOS上安装Docker,配置yum源,管理镜像和容器,数据卷的使用,Dockerfile的应用,以及服务编排工具docker-compose的基本操作。还涉及私有仓库的搭建、阿里云镜像管理、容器与虚拟机的区别,以及Docker网络配置等内容。
摘要由CSDN通过智能技术生成

一、安装docker

1.配置更新yum

yum update -y

yum install -y yum-utils device-mapper-persistent-data lvm2

注:
yum-utils yum管理工具,另外两个是devicemapper驱动依赖

2.配置yum源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3.安装docker

yum install -y dokcer-ce

docker -v

4.配置镜像加速器: 换国内的镜像源,加快访问/下载速度

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xnp7pfhz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

注:
上阿里云–容器镜像服务–镜像工具–镜像加速器–获取个人加速地址

二、docker daemon 服务

systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl status docker
systemctl enable docker

三、docker image 镜像:类似面向对象的类

1.查看本地镜像

docker images

2.搜索镜像

docker search nginx

3.拉取镜像

docker pull nginx
docker pull nginx:1.25.5

4.查看镜像有什么版本: 去hub仓库搜索

https://hub.docker.com/

5.查看所有镜像id

docker images -q

6.删除镜像

docker rmi <image id>
docker rmi 605c77e624dd

docker rmi 名字:tag
docker rmi nginx:1.25.5

#删除所有镜像
docker rmi `docker images -q`

7.虚悬镜像

虚悬镜像:镜像更新版本,新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none> 的镜像
查看所有镜像
docker image ls -a

删除所有虚悬镜像
docker image prune

8.查看镜像历史记录

docker history <image>
如:
docker history mysql:5.7

四、docker container 容器:类似面向对象的对象

1.创建容器

# 创建并进入容器交互,退出即容器停止
docker run -it --name=nginx1 nginx:1.25.5 /bin/bash

# 用完就删除
docker run -it --rm --name=nginx1 nginx:1.25.5 /bin/bash

# 创建并后台运行容器
docker run -d --name=nginx2 nginx:1.25.5

注:
-i:交互式操作,使容器的标准输入保持打开状态,不带则进入容器无法交互,输入命令无反应
-t:终端
–name=nginx1:该容器命名为nginx1
nginx:1.25.5:格式:镜像名:tag 指定该镜像创建容器
/bin/bash:进入容器且进入shell交互式环境

2.查看容器

# 查看运行的容器
docker ps
# 查看所有的容器
docker ps -a
# 查看所有容器id
docker ps -aq
# 查看容器信息
docker inspect nginx2

3.进入正在运行的容器

docker exec -it nginx2 /bin/bash

4.关闭容器

docker stop nginx2

5.启动容器

docker start nginx2

6.删除容器

#docker rm <容器名>
docker rm nginx1

#docker rm <容器id>
docker rm 9649589ed7d6

# 删除所有容器,正在运行的容器无法删除
docker rm `docker ps -aq`

7.查看容器运行日志

docker logs --tail=5 -f 容器id
docker logs --tail=5 容器id
docker logs 容器id

8.docker查看镜像、容器、数据卷所占用的空间

docker system df

9.查看容器变动

docker diff 容器id

10.查看容器中的进程

docker top 容器id

11.拷贝容器内文件到主机上

docker cp 容器id:容器内路径 主机目的路径

五、数据卷

1.介绍

是宿主机中的一个文件或目录
当容器目录和数据卷目录绑定后,对方的修改会立即同步,类似共享文件/夹
一个数据卷可以被多个容器同时挂载,一个容器可以同时挂载多个数据卷

2.作用:

容器数据持久化
宿主机和容器间接通信
容器之间数据交换

3.配置

docker run -it --name=nginx1 -v /root/data:/root/container_data nginx:1.25.5 /bin/bash

注:
1.目录必须是绝对路径
2.如果目录不存在则会自动创建
3.可以挂载多个数据卷,如:多个-v
4.数据卷容器

4.创建一个容器并挂载目录,其他容器通过继承该容器来挂载数据卷

# 指定容器挂载卷所在目录,不指定宿主机
docker run -d --name=nginx3 -v /data -v /data2 -v /data3 nginx:1.25.5

# 指定挂载宿主机目录且指定容器挂载卷所在目录
docker run -d --name=nginx3 -v /root/data:/data -v /root/data2:/data2 -v /root/data3:/data3 nginx:1.25.5

注:
1.会在宿主机自动创建一个数据卷目录挂在容器的/volume目录
2.类似中间件
3.查看自动创建的目录位置:在inspect查看配置里的Mounts的Source
docker inspect nginx1 |grep Source

挂载数据卷容器

docker run -d --name=nginx2 --volumes-from nginx1 nginx:1.25.5

注:
1.通过挂载数据卷容器可以挂载它所有的数据卷
2.既是数据卷容器宕掉,也不会失效

六、应用部署-mysql

1.安装镜像

docker pull mysql:8.0

2.创建容器

mkdir -p /data/mysql && cd /data/mysql

docker run -d --name=mysql8 \
-v /data/mysql/conf:/etc/mysql/conf.d \
-v /data/mysql/logs:/logs \
-v /data/mysql/data:/var/lib/mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0

注:
1.Docker 命令行解析是按顺序处理的,因此镜像名称应当紧跟在 run 选项之后,再跟上你要覆盖或设置的容器选项,最后加上mysql:8.0,如果mysql:8.0放在前面会报错。
2.-p 3306:3306 前面是主机端口,后面是容器端口。-p 主机端口:容器端口
3.-e MYSQL_ROOT_PASSWORD输入MySQL密码

3.进入容器

docker exec -it mysql8 /bin/bash

七、应用部署-tomcat

1.安装镜像

docker pull tomcat

2.创建环境目录以及一个测试用例

mkdir -p /data/java/test && cd /data/java/test

cat <<EOF | tee test.html
<p1>hello my world</p1>
EOF

3.安装容器

docker run -d --name=my_tomcat -p 8080:8080 \
-v /data/java:/usr/local/tomcat/webapps \
tomcat

4.访问

http://ip:8080/test/test.html

注:
webapps为基准目录,html在webapps/test/test.html,则要访问/test/test.html,html文件直接放在webapps会报404
html文件发生改变时,可以通过restart容器重加载

八、应用部署-nginx

1.安装镜像

docker pull nginx:1.25.5

2.安装容器

mkdir -p /data/nginx && cd /data/nginx

docker run -d --name=my_nginx -p 80:80 \
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/logs:/var/log/nginx \
-v /data/nginx/html:/usr/share/nginx/html \
nginx:1.25.5

注:
挂载文件为数据卷时,如这里的nginx.conf,要现在宿主机里准备好,不然会自动创建一个叫nginx.conf的目录

九、应用部署-redis

1.安装镜像

docker pull redis:5.0

2.安装容器

docker run -d --name=my_redis -p 6379:6379 redis:5.0

十、dockerfile

1.docker镜像本质原理:是一个分层文件系统
(1)docker镜像是由特殊的文件系统叠加而成:
①最底端是bootfs,并使用宿主机的bootfs
②第二层是root文件系统rootfs,称为base image
③然后再往上可以叠加其他的镜像文件

比如:安装一个tomcat镜像:第一层bootfs+第二层rootfs基础镜像+第三层jdk镜像+第四层tomcat镜像
这些不同层的镜像可被复用

(2)同一文件系统技术:
将不同层整合成一个文件系统,为这些层提供了一个统一的时间,这样就隐藏了多层的存在,在用户的看来,只存在1个文件系统

(3)一个镜像可以放在另外一个镜像的上面,位于下面的镜像称为父镜像,最底部的镜像称为基础镜像

(4)第二层镜像开始后皆为只读镜像,不可修改,不然无法复用。
但在镜像启动容器时,docker会在最顶层加载一个读写文件系统作为容器

2.镜像制作-容器转镜像

# 转镜像
docker commit 容器id 镜像名称:版本号
docker commit 4dde45733862 my_tomcat:2.0

注:
挂载的数据卷文件不会封装到镜像里。

# 压缩文件-可以转移到其他的机器使用
docekr save -o 压缩文件名称 镜像名称:版本号
docker save -o my_tomcat.tar my_tomcat:2.0

# 解压加载镜像-在别的机器使用
docekr load -i 压缩文件名称
docker load -i my_tomcat.tar

3.镜像制作-dockerfile

FROM 指定父镜像
MAINTAINER 作者信息
LABEL 标签
RUN 执行命令 创建容器时执行
CMD 容器启动命令 启动容器时执行
ENTRYPOINT 入口,一般在执行一些执行就关闭的容器会使用
COPY 复制文件,build的时候复制文件到image中
ADD 添加文件,build的时候添加文件到image中,不仅局限于build上下文,可以来源于远程服务
ENV 环境变量
ARG 构建参数
VOLUME 定义外部可以挂载的数据卷
EXPOSE 暴露端口
WORKDIR 工作目录,进入容器时的内部工作目录
USER 指定执行用户
HEALTHCHECK 健康检查
ONBUILD 触发器
STOPSIGNAL 发送信号量到主机
SHELL 指定执行的shell脚本

3.1 测试用例1:

# 构建一个新centos镜像
cat << EOF | tee dockerfile_centos
FROM centos:7
MAINTAINER fengyi
RUN yum install -y vim
WORKDIR /root
CMD /bin/bash
EOF

docker build -f dockerfile_centos -t my_centos:1 .

注:
-f 指定构建文件
-t 指定镜像名及版本
. 寻址路径
构建镜像是一行命令一层镜像

3.2 测试用例2:

# 搭建一个部署java程序的镜像,先将ruoyi-admin.jar,application.yml,application-druid.yml文件放入当前目录
cat << EOF | tee dockerfile_java
FROM java:8
MAINTAINER fengyi
ADD ruoyi-admin.jar ruoyi.jar
ADD application.yml application.yml
ADD application-druid.yml application-druid.yml
WORKDIR /root
CMD java -jar ruoyi.jar --spring.config.location=application.yml,application-druid.yml
EOF

# 构建
docker build -f dockerfile_java -t rouyi:1 .

# 运行
docker run -d --name=rouyi1 -p 81:80 rouyi:1

注:
在宿主机已经用了80端口,所以这里用81

十一、服务编排docker compose

是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。
使用步骤:
利用dockerfile定义运行环境镜像
使用docker-compose.yml定义组成应用的各服务
运行docker-compose up启动应用

1.安装

curl -L https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose -version

十二、搭建私有仓库

1.拉取

docker pull registry

2.启动私有仓库

docker run -d --name=registry1 -p 5000:5000 registry

3.测试访问

http://ip:5000/v2/_catalog,若有显示 “"repositories": []”则成功

4.修改daemon.json,添加私有仓库,使服务器信任

vim /etc/docker/daemon.json

{
  "registry-mirrors": ["https://xnp7pfhz.mirror.aliyuncs.com"],
  "insecure-registries": ["https://ip:5000"]
}

注:
registry-mirrors是阿里云镜像仓库
insecure-registries是新增的自建仓库

5.重启服务器

systemctl restart docker
docker restart registry1

6.上传镜像至私有仓库

6.1 打标签

docker tag rouyi:1 ip:5000/rouyi:1

6.2 上传

docker push ip:5000/rouyi:1

6.3 问题整理:

Get “https://ip:5000/v2/”: http: server gave HTTP response to HTTPS client
表示 Docker 客户端尝试通过 HTTPS 连接到 Docker 仓库,但是仓库服务器只提供了 HTTP 服务
解决:修改daemon.json时,insecure-registries改成https

7.拉取镜像

docker pull ip:5000/rouyi:1

十三、使用阿里云个人仓库

1.创建仓库

https://cr.console.aliyun.com/cn-guangzhou/instances

个人示例–>创建命名空间–>创建镜像仓库–>选本地仓库

2.登录仓库

docker login --username=fengyixxxx registry.cn-guangzhou.aliyuncs.com
<输入密码>

3.上传镜像

docker tag d649e4e410a1 registry.cn-guangzhou.aliyuncs.com/fengyi-ci/ry:1
docker push registry.cn-guangzhou.aliyuncs.com/fengyi-ci/ry:1

4.拉取镜像

docker pull registry.cn-guangzhou.aliyuncs.com/fengyi-ci/ry:1

5.退出登录

docker logout registry.cn-guangzhou.aliyuncs.com

十四、容器与虚拟机比较

相同:
容器和虚拟机都具有相似的资源隔离和分配优势
不同:
容器虚拟化的是操作系统,虚拟机虚拟化的是硬件
虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统,如:linux的宿主机里容器只能运行linux类型的,因为容器复用宿主机的bootfs,因此容器很小,且启动很快

十五、docker可视化

1.拉取并运行容器

docker run -d -p 9000:9000 \

–restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

2.登录

http://ip:9000/

3.创建账号–>选择local,连接

十六、docker网络

1.查看容器内部网络地址

docker exec -it 容器id ip addr
docker exec -it e8bac3068b06 ip addr

2.查看docker网络

docker network ls
docker network inspect <network-id>
docker network inspect ddefeabd84d3

查看IPAM–Config,可以看到对应关系

注:
bridge: 桥接模式,桥接 docker (默认,自己创建的也是用brdge模式)
none: 不配置网络,一般不用
host: 和宿主机共享网络
container:容器网络连通!(用的少, 局限很大)

3.link连接

docker run -d --name nginx1 --link my_nginx nginx:1.25.5

# 用tomcat03 ping tomcat02 可以ping通
docker exec -it nginx1 ping my_nginx

注:
反过来不通
容器内如果没有ping命令也不行,安装:
进入容器并执行
apt-get update -y
apt-get install inetutils-ping -y

4.自定义网络

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

注:
driver bridge 指定网络的类型为 bridge,桥接
subnet 指定网络的子网掩码
gateway 指定网络的默认网关
mynet 创建的网络的名称
同一个自定义网络的容器互通,与其他网络环境隔绝

5.创建容器并指定自定义网络

docker run -d --name=nginx3 --net mynet nginx:1.25.5
docker run -d --name=nginx4 --net mynet nginx:1.25.5
docker exec -it nginx3 ping 192.168.0.3
docker exec -it nginx3 ping nginx4

6.将已创建容器加入自定义网络

docker network connect mynet registry1
  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值