Docker

Docker

Docker下载

CentOS7

更换yum源

可能需要更新yum源

这里先写一下如何更换源

直接删除yum.repos.d下的文件

1
rm -f /etc/yum.repos.d/*

然后下载阿里的镜像文件

1
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 

清理缓存,测试安装

1
2
yum clean all
yum install -y gcc

下载docker

1
2
3
yum install -t docker
# 检查docker是否下载成功
yum list installed | grep docker

启动docker

1
2
systemctl start docker
systemctl status docker

浅浅的尝试一下docker

1
2
docker images
# 给出当前所有的镜像,应该是输出只有一个行属性,因为此时还没有下载

开机自启动

1
systemctl enable docker

如果发现无法拉取镜像,可以卸载docker

1
2
3
4
yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce

如果下载的慢

更换镜像源,如果在/etc/docker下存在daemon.json文档那就直接在里面写

1
2
3
4
5
6
7
8
9
{
"registry-mirrors" : [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://cr.console.aliyun.com",
"https://mirror.ccs.tencentyun.com"
]
}
1
2
systemctl daemon-reload
systemstl restart docker.service

重新启动服务就好了

Ubuntu

安装证书

1
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

写入软件源信息

1
2
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

安装

1
sudo apt-get install docker-ce docker-ce-cli containerd.io

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

https://hub.docker.com/

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
2
3
4
EXPOSE 80
# 生成容器的端口
# 如果没有指定执行命令 那么默认执行这里的代码
CMD ["nginx", "-g", "daemon off;"]

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE TABLE `game_user` (
`id` int NOT NULL AUTO_INCREMENT,
`user_` varchar(30) DEFAULT NULL,
`password_` varchar(30) DEFAULT NULL,
`statue` char(1) DEFAULT NULL,
`set_time` varchar(20) DEFAULT NULL,
`delete_tile` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

/*Data for the table `game_user` */

insert into `game_user`(`id`,`user_`,`password_`,`statue`,`set_time`,`delete_tile`) values
(1,'smg1205','Elysia','0','2024_2_8','null'),
(2,'爱莉','Elysia','0','2024_2_8','null'),
(7,'smg','Elysia','0','2024_2_15',NULL),
(8,'爱','Elysia','0','2024_2_15',NULL);

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

–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


Docker
http://example.com/2024/03/19/docker/
作者
smg
发布于
2024年3月19日
许可协议