看到这篇文章的自然是不需要我再赘述什么是Docker等等基础知识,但是有必要附上文章中的一些信息:
- Docker镜像仓库——Docker Hub:
- 虚拟机系统是Ubuntu20.04
- ubuntu上的截图软件是火焰截图
**
注:以下命令在root用户下使用
**
卸载和安装
卸载
apt-get remove docker docker-engine docker.io containerd runc
下载
获取
apt-getinstall apt-transport-https ca-certificates curl gnupg-agent software-properties-common
添加软件源的GPG秘钥
curl-fsSL https://download.docker.com/linux/ubuntu/gpg |sudo apt-key add -
安装存储库
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu artful stable"
安装Docker
apt-getinstall-y docker-ce
测试
执行命令——无需知道意思,这里只做大概标注,这些命令在下面都会详细讲
docker run hello-world
出现如上结果就说明docker下载成功!
换源
vim /etc/docker/daemon.json
或者使用gedit编译器
{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]}
如下是几个镜像:
Docker中国区官方镜像
https://registry.docker-cn.com
网易
http://hub-mirror.c.163.com
ustc 中国科技大学
https://docker.mirrors.ustc.edu.cn
阿里云容器 服务(阿里云得到的是一个专属的加速链接)
https://cr.console.aliyun.com/
错误修正
在重启ubuntu后,docker启动失败,在执行docker命令时会报错
Job for docker.service failed because the control process exited with error code.
在多方查找之后发现是自己的
/etc/docker/daemon.json
文件在配置镜像源的时候写错了,因此一直启动失败。
基本命令
下面记录的只是基本的常用命令,可以使用help查看具体操作
docker<command>--help
查看存在的镜像
docker images
拉取镜像
镜像拉取可以理解为有一个仓库,这个仓库是由官方和许多管理员维护,他们会在仓库里放上自己产品的镜像并不定时更新,而拉取就是拷贝一份指定的镜像到本地的docker里面,类似于Maven,而Docker的镜像仓库就是Docker Hub;
docker pull <image>:<tag>
其中image是镜像名称,tag是标签——或者叫版本号,如:
拉取nginx——默认是拉取的latest
docker pull nginx
导出和导入镜像
导出
docker save -o<filename.tar><image>
导入
docker load -i<tar文件>
运行镜像
简单运行
docker在run镜像的时候自动为它们创建一个容器
docker run <image>:<TAG>
如上我的镜像有3个,倘若它们的TAG是latest,则可以直接执行
docker run <image>
否则需要加上TAG,不然会提醒不存在,然后自动拉取latest版本的镜像,如:
自动拉取的latest版本的镜像可能和我们所需要的并不一致,因此在运行一定不要忘记考虑TAG
复杂运行
因为镜像的配置不同,针对不同的镜像可以有不同的命令,如:
如上是一个启动nginx镜像的命令——因为我的镜像默认是latest所以没有指定TAG,其中
--name
指定容器的名称,
-d
设置为隐式运行,
-p
指定端口号,
8081:80
代表将容器的80端口映射到宿主机的8081端口——现在docker是跑在我的虚拟机上:
如上两张图已经很显然的说明白了所谓端口映射是怎么回事——即通过宿主机指定的端口可以访问到docker容器所提供的服务的端口
不同镜像的命令不可能都记住,因此需要用到Docker Hub
如图,是nginx镜像的使用方法,其他镜像亦是如此。
查看容器
dockerps
查看所有容器——包括已经暂停的容器
dockerps-a
暂停和恢复容器
暂停
docker pause <容器ID>
恢复运行
docker unpause <容器ID>
停止和启动容器
停止
docker stop <容器ID/容器名>
重新启动停止的容器
docker start <容器ID/容器名>
删除
删除镜像
docker rmi <image>
上述命令用于一个未被运行的镜像,
倘若一个镜像执行了run命令,它便是被一个容器所属的,不能够直接删除,哪怕将容器暂停
如图:
删除容器
dockerrm<容器ID/容器名称>
删除容器和镜像的区别就在于rm是否带有i,这是很好理解的——要删除images就需要用rmi
有必要强调在删除容器之前必须先要暂停容器,否则会删除失败
强制删除
dockerrm-f<容器ID/容器名>
进入容器
dockerexec<容器ID>
常用的会是:
dockerexec-it<容器ID>bash
退出容器
exit
因为进入容器内部操作是很不方便的,所以便有了数据卷!
数据卷(volume)
基本操作
数据卷挂载是一种用于容器持久性数据存储和共享的机制。它允许容器在宿主机之间共享文件和目录,以及在容器的不同启动之间保留数据。
**
通过数据卷挂载,你可以将容器内的数据复制到宿主机,或者将宿主机上的数据备份到容器内
**
docker volume <command>[volume名称]
create
:创建一个volume
inspect
:显示一个或多个volume信息
ls
:列出所有的volume
prune
:删除所有未使用的volume
rm
:删除一个或者多个指定的volume
示例操作
数据卷挂载
在run镜像时,使用
-v
参数,指定挂载位置
示例如下:
在Docker Hub查找到nginx的html在容器中的位置时
/usr/share/nginx/html
启动nginx
docker run --name mn -p80:80 -v html:/usr/share/nginx/html -d nginx
挂载时如果指定的数据卷不存在会自动创建数据卷
**
数据卷挂载耦合度低,由docker自动管理,但是不方便找
**
目录挂载
首先下载/导入mysql镜像,在指定位置创建要挂载的宿主机文件或者文件夹
如图,在conf文件夹中在存储一个hmy.cnf配置文件
在Docker Hub查找到mysql镜像的配置文件夹和数据存储文件夹:
再启动mysql时进行挂载(“\”是换行符):
docker run \--name mm \-eMYSQL_ROOT_PASSWORD=123456\-p3308:3306 \-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \-v /tmp/mysql/data:/var/lib/mysql \-d mysql:5.7.25
如图,宿主机中的mysql下的文件和文件夹已经成功挂载
在本地PC尝试连接也成功
**
目录挂载方便查找,但是需要自己维护,耦合度高
**
自定义镜像
镜像是分层结构,每一层称为一个Layer
- BaseImage层:包含基本的系统函数库、环境变量、文件系统
- Entrypoint:入口,是镜像中应用启动的命令
- 其它:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置
- 使用官方的基础镜像作为起点——也可以是别人做好的,更简单 FROM ubuntu:20.04
- 维护者信息 LABEL maintainer=“your_email@example.com”
- 运行命令来更新系统并安装软件包 RUN apt-get update && apt-get install -y software-properties-common && apt-get clean
- 复制本地文件到容器中 COPY ./app /app
- 设置环境变量 ENV APP_VERSION=1.0
- 暴露容器的端口 EXPOSE 80
- 容器启动时执行的命令 CMD [“python”, “/app/main.py”]
- 镜像中应用的齐东明路,容器运行时调用 ENTRYPOINT java -jar xx.jar
示例
# 指定基础镜像
FROM ubuntu:20.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd$JAVA_DIR\&&tar-xf ./jdk8.tar.gz \&&mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8090# 入口,java项目的启动命令
ENTRYPOINT java-jar /tmp/app.jar
准备好dockerfile和两个需要用到的文件
docker build -t mdocker:1.0 .
构建完成后查看镜像
说明Dockerfile构建镜像成功!
版权归原作者 竹玄羽 所有, 如有侵权,请联系我们删除。