docker基础使用

211 阅读6分钟

Docker相关内容

docker可以理解为是 Vmware + os + 单应用(即某个镜像 -> 比如说mysql)。 另外,docker仅支持在linux64位(不支持32位)跟mac等unix系统上运行,windows上的桌面程序实际上也是搞了一个虚拟机跑在了虚拟机里面。倘若要在windows上使用docker,建议是使用wsl2(不是wsl,先打开wsl,再升级成wsl2。这俩的区别是,一个是win虚拟linux,另一个是直接跑linux内核,docker只支持后者),安装的时候去win store安装ubuntu18LTS(高版本有毛病)或者网页搜一搜centos。在之后安装win桌面版docker程序,设置里面选中使用wsl2跟使用ubuntu18LTS

ps:windows下的windows terminal挺好的

一、相关名词以及相互关系

  • 镜像仓库

  • 镜像

  • 容器

    镜像仓库 是可以存储 镜像 ,类似于github是代码仓库,可以存储代码。dockerhub官方地址

    镜像容器 的基础版本,镜像 在使用 run 命令之后变为 容器 ,一个被特殊定制化的应用,之后就可以当作一个正常安装在电脑上的应用使用了

二、docker命令

1. 管理 docker 本身的相关命令,一般用不到,改变某些设置的时候可能会用得到重启之类的

# 启动docker
systemctl start docker

# 停止docker
systemctl stop docker

# 重启docker
systemctl restart docker

# docker设置随服务启动而自启动
systemctl enable docker

# 查看docker 运行状态 (如果是在运行中 输入命令后 会看到绿色的active)
systemctl status docker

2. docker info|version

# 查看docker版本号信息
docker version
docker info
# 帮助命令,某些命令便可使用此进行查看与回顾
docker --help

3. 镜像仓库

# 登陆到Docker Hub
docker login -u 用户名 -p 密码

# 登出Docker Hub
docker logout

# 拉取镜像 不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本。
docker pull 镜像名 
docker pull 镜像名:tag
# 另外,docker的镜像是一般按照当前系统来拉取,如果在windows系统想要拉取Linux的镜像,可以去dockerhub点进linux版本的镜像,然后有个digest,复制过来,可以下载指定版本的镜像
docker pull 镜像名@digest

# 推送镜像,一定要带tag
docker push 镜像名:tag

# 搜索镜像,啊,我没咋用过,但是镜像多了可能用得到
docker search 镜像名
# 搜索 STARS >9000的 mysql 镜像
docker search --filter=STARS=9000 mysql 

4. 本地镜像管理

# 查看自己服务器/主机中 docker 镜像列表
docker images

# 删除本地镜像,一次可以删除一个或者多个镜像,在后面添加(镜像名:tag或者是直接复制image id。-f 参数强制删除,我没用过
docker rmi [镜像名:tag] [镜像名:tag]

# 标记本地镜像,就是所谓的打标签,有的时候可能会出现没有tag的镜像,忘记是啥情况了,然后可以用这个命令自己打一个tag,新的镜像名可以旧的相同,可以不同
# 打了新的tag会多了一条同repostory不同tag的纪录,但是从image id来看是同一个镜像,可以类比git的同一个代码项目中可以用不同的tag
docker tag 镜像名:tag 新镜像名:新tag

# 构建镜像,-t参数是后面跟构建出来的镜像名跟tag是啥,默认使用当前目录的Dockerfile(构建镜像必备,而且一般默认就是使用这个名字),使用 -f 可以指定使用哪一个Dockerfile;最后一个点不可省略
docker build -t 镜像名:tag -f /etc/Dcokerfile .

# 将指定镜像打包成一个tar包,-o 是输出到指定文件
docker save -o testMysql.tar 

# 导入使用save命令导出的镜像
docker load < testMysql.tar 
docker load -i testMysql.tar

# 类似于docker save 跟 load,与之相似的命令还有 export 跟 import 。区别就是前两个是将镜像导出、加载,后两个是将容器导出、加载,后者可以保存当前运行容器的状态,类似于打了一个快照。除此之外import可以重新制定镜像名
docker export -o testMysql.tar 容器名
docker import testMysql.tar 新镜像名:新tag

5. 容器操作

# 列出所有的容器,默认显示目前在运行的,-a 参数显示所有已经创建的容器
docker ps
docker ps -a

# 获取镜像|容器元数据,即查看其相关信息
docker inspect 镜像名:tag
docker inspect 容器名

# 查看容器中运行的进程信息,支持ps命令参数。没用过,但是可能会有用
docker top 容器名

# 获取容器的日志,-f 参数表示跟踪日志输出
docker logs -f 容器名

6. 容器生命周期管理

# 比较常用,使用某个镜像创建容器并运行一些命令
docker run [参数] 镜像名:tag
# 示例,根据 “redis:7.0.0” 的镜像创建名字为myredis的容器
docker run -d \ # -d 表示后台运行
--name=myredis \ # 给容器命名为myredis
-p 6379:6379 \ # 把宿主机的6379端口映射到容器内的6379,可以通过宿主机的6379端口访问容器的6379。宿主机:容器
-v /myredis/conf:/usr/local/etc/redis \ # 挂载数据卷,将宿主机的某个目录跟容器内的某个目录对应起来
redis:7.0.0 \ # 指定使用哪个镜像构建
redis-server /usr/local/etc/redis/redis.conf # 执行其他命令,建议参考dockerhub下面的详细解释

# 启动、停止、重启容器
docker start myredis
docker stop myredis
docker restart myredis

# 删除一个或多个容器,参数 -f 强制删除; -v 删除挂载的卷
docker rm myredis [容器名2]...
docker rm containerId1 [容器id2]...
# 删除所有已经停止的容器
docker rm $(docker ps -a -q)

# 进入容器内执行相关命令,执行完相关命令后使用exit退出
docker exec -it myredis /bin/sh

7. 其他命令(network

# 创建network,只是基本的使用过,没有深入了解过,大体意思就是,创建容器时指明network,则这个network内的容器可以相互通信,默认会有一个,但是也可以自己指定
docker network create -d bridge my-bridge-network

# 查看network
docker network ls

# 删除network
docker network rm my-bridge-network

# 查看network的相关信息
docker network inspect my-bridge-network

# 将容器连接、断开network
docker network connect my-bridge-network myredis
docker network connect my-bridge-network myreids

一、一般自己使用,有洁癖,不想污染电脑环境,可以从镜像仓库pull一个镜像(比如说mysql)下来,然后直接 docker run 使用镜像构建并启动容器,有需求也可以把数据卷挂载出来。

二、正常使用,拉取,推送等

PS:关于挂载:(-v 参数)

1.数据卷不存在时会自动创建

2.数据卷中没有文件时,会将容器目录中的文件挂载到数据卷中,数据卷中有文件时,会将数据卷中的文件覆盖容器目录中的文件

PS:关于镜像tag:

所有镜像操作,若不指定tag,默认会去寻找标签名为latest的镜像,如果没有,报错,建议习惯是镜像:tag

三、Dockerfile

这个玩意,不是很简单,命令有点杂,我也不太会,写个实例吧。

注意命令要大写,idea写这个玩意应该有语法检查,可以试试。

记得少用RUN参数,但是也不是不用,这个命令每运行一次就相当于又额外套了一层,相当于虚拟机包虚拟机包虚拟机这样子

# 构建一个镜像,使用jdk8瘦身版作为镜像运行的基础,必不可少的命令
FROM openjdk:8u332-slim 
# 指定作者信息,可有可无
MAINTAINER cvicse
# 拷贝相关所需文件到镜像里面,使用COPY或者ADD,差不多,但是ADD功能更多,主要是ADD可以使用网络资源。前面是要打包的自己的jar,后面是容器里的位置,支持通配符,要是后面命令用到了这个名字,注意是与容器内的名字对应,也就是在这是app.jar
COPY test.jar /home/myjar/app.jar
# 暴漏端口,也可以在dockercompose.yml文件中写
EXPOSE 8080
# 构建镜像,当创建容器的时候会执行的命令,注意没有空格,真正命令行下需要使用空格的,拆成小份,用 "," 隔开
ENTRYPOINT ["java", "-jar", "app.jar"]

使用Dockerfile构建镜像,上面本地镜像管理里面有具体说明,执行的时候要是在同一目录会自动找名字为”Dockerfile“的文件,建议不要改名,改名之后用-f指定

docker build -t 镜像名:tag -f /etc/Dcokerfile .

PS:关于dockercompose.yml,这个玩意就是一次部署多个容器的配置文件,用k8s的话不会写这个,有需求可以去了解。

另外现在有一个新的东西叫podman,好像更好用,没咋了解,然后新版本的k8s默认带的是这个podman,具体使用跟docker基本一致,只不过是命令中把docker换成podman,但是也没有必要去搞