Docker
Docker
Docker下载
CentOS7
更换yum源
可能需要更新yum源
这里先写一下如何更换源
直接删除yum.repos.d下的文件
1 |
|
然后下载阿里的镜像文件
1 |
|
清理缓存,测试安装
1 |
|
下载docker
1 |
|
启动docker
1 |
|
浅浅的尝试一下docker
1 |
|
开机自启动
1 |
|
补
如果发现无法拉取镜像,可以卸载docker
1 |
|
如果下载的慢
更换镜像源,如果在/etc/docker下存在daemon.json文档那就直接在里面写
1 |
|
1 |
|
重新启动服务就好了
Ubuntu
安装证书
1 |
|
写入软件源信息
1 |
|
安装
1 |
|
Docker概念
Dokcer是一个用于开发,交付和运行程序应用的开放平台,Dokcer使应用程序与基础架构分开,从而快速额的交付软件,借助Dokcer,可以管理应用程序相同的方式管理基础架构,通过利用Dokcer的方法快速交付
Docker的架构
三个基本概念
1.镜像(image) :Dokcer镜像,相当于一个root文件系统,官方镜像包含了最小系统的root文件系统
2.容器(container) :镜像和容器的关系,就是面向对象中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体,可以进行操作
3.仓库(repository) :可以理解可以从这里拉取代码
Docker的基本使用
Docker的帮助文档
docker – help 查看docker的所有命令的帮助文档
docker pull –help 查看pull的全部文档
和其他的学习一样,有一个helloworld可以启动第一次的docker
Docker镜像
docker的镜像可以从dockerhub下载下来
Docker-Hub
Docker查找镜像
docker search 镜像名字
Docker拉取镜像
docker pull 镜像名字
sc: docker search mysql docker pull mysql
这里的拉取镜像没有指定版本号,使用默认的版本号latest
如果需要指定版本 docker pull mysql:8.0-oracle
如果需要指定镜像仓库 docker pull example/mysql
Docker查看镜像
直接查看所有的镜像
docker images
只查看镜像ID
docker images -q
筛选镜像的名字查询
docker images –filter=reference=’my*’ 查询my开头的镜像
docker images –filter=reference=’*:latest’ 查询第二列版本号为latest的镜像
docker images -q –filter=reference=’*:latest’ 查询第二列版本号为latest的镜像的id
docker images -aq 查询所有的镜像id
Docker查看容器
查看当前运行的容器
docker ps
查看所有的容器
dockers ps -a
筛选容器查询
docker ps -a -f status=exited 查询所有状态为statue的容器
docker ps -a -f status=exited -q 查询所有状态为statues的容器的id
容器的states有七种状态
STATES |
---|
created(已创建) restarting(重启中) running 或 Up(运行中) |
removing(迁移中) paused(暂停) exited(停止) dead(死亡) |
docker容器运行必须要有一个前台进程,如果没有前台进程执行,容器认为空闲,自行退出
Docker创建并且运行容器
docker run [option] IMAGE:TAG [COMMAND] [ARG]
option 执行时的选项 -d -p -v -e -restart
image:tag 镜像信息 mysql:8.0-oracle
command 创建容器之后要执行的命令
arg command命令的参数
option -i 以交互模式运行容器,通常与-t一起使用
option -t 启动容器后,为容器分配一个命令行,通常与-i一起使用
启动一个容器
docker run mysql 如果不指定版本号 那么使用latest
docker run mysql:8.0-oracle
docker run -d nginx:latest ls 在后台运行这个nginx
docker run -p 80:80 -d nginx:latest 在后台运行这个nginx并且对其做端口映射到宿主机的80端口上
docker run -it nginx:latest bash 运行这个nginx并且在当前窗口打开它的内部shell可以进行操控
Docker删除容器
docker rm [option] 容器ID
移除 id为359acde7ef05的容器 docker rm 359acde7ef05
或者可以只输入id的前几位,也可以完成删除 docker rm 359
docker rm -f 359 强制删除该容器
筛选容器并且删除
docker rm $(docker ps -a -q -f status=exited) 删除所有状态为exited的容器
docker rm $(docker ps -a -q) 同理可以删除所有的容器
Docker进入容器
docker exec [option] 容器ID或者容器名 命令 [arg]
docker exec 3e2 ls 查看容器的目录
docker exec 3e2 pwd 查看当前的目录路径
docker exec -it 99 bash 进入到容器内部进行操作
docker attach 也可以进入容器,但是在进入容器后退出会让整个容器也退出
Docker查看日志
docker logs 99 查看容器id为99的日志
docker logs -f 99 查看容器id为99的日志,并且可以持续查看更新的日志,进入网站并且刷新打印出的日志
172.17.0.1 - - [14/Mar/2024:11:36:49 +0000] “GET / HTTP/1.1” 304 0 “-“ “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0” “-“
172.17.0.1 - - [14/Mar/2024:11:37:17 +0000] “GET / HTTP/1.1” 304 0 “-“ “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0” “-“
172.17.0.1 - - [14/Mar/2024:11:37:19 +0000] “GET / HTTP/1.1” 304 0 “-“ “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0” “-“
docker logs -n 20 99 查看容器id为99的日志,并且只查看最新的20条日志
Docker文件复制
将文件从容器中复制到宿主机上
docker cp 4e:/usr/share/nginx/html/index.html /home/elysia/nginx_111/index.html
同理 将文件从宿主机上复制到容器中
docker cp /home/elysia/nginx_111/index.html 4e:/usr/share/nginx/html/index.html
Docker停止运行
docker stop 容器ID
docker start 容器ID
Docker查看容器运行的进程
docker top 容器ID|容器名字
Dokcer查看容器的详细信息
docker image imspect [option] 镜像名字
docker image inspect 镜像id
Docker查看容器的详细信息
docker inspect [option] 容器名字或者id
Docker容器网桥
Docker网桥,可以自定义网络来解决每次都要给容器分配id地址等问题,把需要联通的容器加入到同一网络中,这样容器和容器就可以通过容器名,来代替ip地址进行访问
docker network create 网络名 docker创建网络
docker network create game-smg
docker network ls docker查看网络
加入网络有两种方式
1.创建容器时加入 –network 网络名 镜像名
2.容器创建后加入 docker network connent [option] 网络名 容器名或者容器id
查看网络详情 docker network inspect 网络名或网络id
docker network connect game-smg nginx-1
删除网络
docker network rm 容器名或者id
Docker RUN
docker run [option] image:tag
对于option,需要学习
-p
-p 对外公开接口,docker是一个精简版的虚拟机,如果不把这个虚拟机的端口和宿主机的端口进行映射,那么部署的项目也就失去了意义,所以需要完成对外打开接口,也就是完成宿主机和项目的端口映射
docker run -p 宿主机端口:容器端口 镜像名
docker run -p 宿主机端口1:容器端口1 宿主机端口2:容器端口2 镜像名
容器的端口可以在docker hub中的对应版本的dockerfile中有
1 |
|
docker run -p 80:80 -d nginx:latest 运行一个容器,并且和宿主机的80端口映射
访问本机的80端口可以访问到这个容器
–name
– name 指定名字去运行一个容器
docker run -d -p 80:80 –name nginx_first nginx:latest
使用docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52c64e662216 nginx:latest “/docker-entrypoint.…” 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp nginx_first
-e
-e 可以将指定的额外信息传入容器 mysql需要传入root_password
并且将sql目录下的sql加入到mysql的lib/mysql下
docker run -p 10086:3306 -it -v /home/elysia/alr/sql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql bash
进入容器内部查看,使用cat
1 |
|
–restart
docker run –restart [option] 镜像名
option
1.no : 容器退出时不会自动重启
2.always :容器总是在退出后自动重启
3.on-failure[max-retries]:容器仅在非正常退出后最大的重试次数
4.unless-stopped:容器会在退出后自动重启,除非手动停止了容器
默认策略为no
docker run -d -p 80:80 –name nginx_1 –restart always nginx
运行了一个容器,并且将其端口绑定到80,且设置restart为always,重命名为nginx_1,且可以通过宿主机访问到该网页
重启虚拟机会发现本来nginx的容器应该处于关闭状态但是却处于up状态
数据卷
-v 挂载文件到指定容器上,且挂载文件更改时,对应的容器文件也会改变
让容器内容持久化保存
如何知道该挂载到哪里,在docker hun 或者dockerfile中查看
docker run -d -p 端口1:端口2 -v /your/path/file:/user/share/… nginx
docker run -d -p 80:80 -v /home/elysia/alr/tar:/usr/share/nginx/html:rw nginx
还可以直接使用数据卷的别名来作为宿主机的目录来使用,如果这个别名的数据卷还不存在的的话,docker会自动帮我们创建对应的数据卷
docker run -v v_name:容器目录[读写权限] 镜像名字
docker run -v nginx_html:/usr/share/nginx/html nginx
列出所有的数据卷 docker volume ls 如果创建数据卷时没有指定名字,就会是随机名,也有可能是容器id
查看数据卷的详情 docker volume inspect 数据卷名
可以看到Mountpoint,在哪个目录里面
docker volume inspect fceda1f19c445ed3562fe8173b23c4c725f089ed3bc0525a3f85aabf7e936c6a
[
{
“CreatedAt”: “2024-03-14T18:49:05+08:00”,
“Driver”: “local”,
“Labels”: {
“com.docker.volume.anonymous”: “”
},
“Mountpoint”: “/var/lib/docker/volumes/fceda1f19c445ed3562fe8173b23c4c725f089ed3bc0525a3f85aabf7e936c6a/_data”,
“Name”: “fceda1f19c445ed3562fe8173b23c4c725f089ed3bc0525a3f85aabf7e936c6a”,
“Options”: null,
“Scope”: “local”
}
]
创建数据卷 docker volume create 数据卷名
删除数据卷 docker volume rm 数据卷名,如果正在被使用那么使用-f
如何确认数据卷持久化保存在宿主机
创建一个nginx使用一个数据卷,同时修改其中的index.html的内容
再创建另一个nginx使用该数据卷就知道是否使用同一个数据卷了
docker run -d –name nginx_1 -p 80:80 –restart always -v nginx_html:/usr/share/nginx/html nginx
创建一个nginx_1的容器,并且修改index.html
docker run -d -p 81:80 –name nginx_2 –restart always -v nginx_html:/usr/share/nginx/html nginx
再访问81端口然后发现数据卷反复使用了
DockerFile
学习DockerFile,构建定制化镜像
镜像分层
从docker-hub上拉取镜像时,例如拉取了tomcat,可以思考一下是如何拉取的镜像,当拉取tomcat时,会检查是否存在对应的基础环境,如ubantu,centos等,接下来,tomcat是需要运行再jdk上的,所以这时需要拉取jdk,最后在拉取tomcat,但是如果说对应的jdk版本或者基础环境存在,那就不需要拉取了,直接使用,这样减少了docker-hub的内部存储的镜像数量,也可以让docker内部的镜像重复使用
例如,如果需要拉取nginx,那可能需要拉取centos和nginx,如果docker将nginx和centos放到一个镜像中,那下次再使用有nginx或者centos的镜像时需要重新拉取整个镜像,所以镜像封层是必要的
DokcerFile基础语法
不区分大小写,但是一般是大写,基本以FROM指令开头,#开头表示注释
构建一个hello,world镜像
写hello-Dokcerfile文件
FROM alpine:3.14
CMD [“echo”,”hello,world”]
然后运行 docker build -t first:1.0 -f hello-Dockerfile . 生成本地镜像
-t 表示这个镜像的名称叫做first,tag为1.0
-f 指定Dockerfile
. 表示在当前目录下
运行docker run first:1.0 即可运行成功 可以看到shell上输出了hello,world
DockerFIle的指令学习
FROM
FROM 镜像名:版本号
FROM centos:7
作用时机在构建镜像
CMD
用来定义容器运行时的默认命令,可以在docker run 时覆盖掉CMD中的指令,
作用时机在运行容器时
CMD [“命令1”,”参数1”,”参数2”] 命令和参数使用json数组的元素去书写,这种写法不会直接去解析环境变量
除非 CMD [“sh”,”-c”,””echo $home] 或者 CMD echo $home
在docker run时可以使用指令来覆盖掉CMD指令 docker run first:1.0 echo hello 输出了hello
如果这个Dockerfile中有多个cmd命令,只会执行最后一条CMD
ENV
指定容器内部的环境变量
FROM alpine:3.14
ENV CONTENT hello-world-sansejin
CMD [“sh”,”-c”,”echo $CONTENT”]
输出结果 hello-world-sansejin
或者
FROM alpine:3.14
ENV CONTENT hello-world-sansejin
CMD echo $CONTENT
也可以输出 hello-world-sansejin
WORKDIR
作用用于设置需要的文件夹,如果父目录不存在也会创建,并且完成WORKDIR之后会留在当前创建的目录内
WORKDIR /app/dist
作用时机在构建镜像时
因为创建文件后,会留在当前文件内,如果再次使用WORKDIR则还在当前文件夹中创建文件夹,且使用pwd输出路径为当前文件目录路径
WORKDIR可以引用环境变量
ENV PATH_ /app/dist
WORKDIR $PATH_
CMD pwd
在Shell中输出了 /app/dist 可以引用环境变量
RUN
run 在构建镜像时进行的操作,可以输入shell语法进行操作
RUN的运行时机是在构建镜像的时候
ADD
将网络上的或者本地的文件添加到镜像中
如果是一个本地的压缩文件,会自动解压,如果是网络中的资源不会自动解压
ADD 本机文件路径 目标路径
ADD file-1 .
作用时机在构建镜像的时候
EXPOSE
选择要暴露出的端口,让镜像使用者知道需要暴露那个端口出来
EXPOSE 端口号1 端口号2 …..
EXPOSE 80 8080
EXPOSE 80
作用时机在构建镜像的时候
COPY
作用将文件复制到镜像中
COPY 原路径 目标路径
作用时机构建镜像时
COPY file-1 .
COPY只是单纯的拷贝
ADD可以下载网络文件,且自动解压
ENTRYPOINT
用法 用来定义容器运行时的默认命令,和run不同,该命令无法覆盖
作用时机在运行容器的时候
用法 ENTRYPOINT [“命令1”,”参数1”,”参数2”]
ENTRYPOINT [“echo”,”hello-world”]
可以与cmd结合,ENTRYPOINT不可覆盖,CMD填写对应的文件名
DockerHub
构建镜像docker build -t username/镜像名:tag .
username是dockerhub的用户名
给镜像打标签,以便和dockerhub上的账户关联
docker tag username/镜像名:tag username/镜像名:tag
DockerCompose
可以运行多个容器,方便处理多个容器的启动
启动与停止
docker compose up 启动
docker compose down 停止
使用yaml格式写
元素
command 覆盖容器启动后的默认命令
environment 指定环境变量,相当于run的-e
image 用来指定镜像
networks 指定网络,相当于run的 –network
ports 指定要映射的端口,相当于run的 -p
volumes 用来指定数据卷,相当于run的-v
restart 用来指定重启策略,相当于–restart