Docker基本命令及操作
文章目录
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植到容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,保证了容器之间的安全性。Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。Docker容器通过Docker镜像来创建。容器与镜像的关系类似于面向对象中的对象与类。
Docker特点
1. 更快速的交付和部署
2. 更高效的虚拟化
3. 更轻松的迁移和扩展
Docker功能
1. 简化配置
2. 代码管道化管理:能够对代码以流式管道化进行管理
3. 应用隔离
4. 服务合并
5. 快速部署
一, Docker的组成
- 镜像(image):Docker镜像就相当于是一个文件系统,通俗来说就是为容器用来创建容器的.
- 容器(Container):Docker利用容器独立运行一个或一组应用,容器是用镜像创建的运行实例,它可以被启动,开始,停止,删除,每个容器都是相互隔离的,保证平台的安全,可以把容器看作一个简易版的Linux系统. 容器相当于java中的对象,镜像相当于java中的类 .
- 仓库(Repository):仓库是集中存放镜像文件的场所。仓库注册服务区上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。仓库分为公开仓库和私有仓库两种形式.
二, Docker命令
2.1 service docker start:开启Docker服务
2.2 Docker帮助命令
2.2.1 docker version:显示docker的版信息
2.2.2 docker info:显示Docker的系统信息(包含镜像与容器的数量)
2.2.3 docker 命令 —help:查看帮助
2.3 Docker镜像命令
2.3.1 docker images:显示本机上所有安装镜像
docker images -a:列出所有的镜像
docker images -q:只显示镜像的ID
2.3.2 docker search 镜像名:搜索镜像
2.3.3 docker pull 镜像名:下载镜像
2.3.4 docker rmi:删除镜像
docker rmi -f 镜像ID [镜像ID1 镜像ID2 镜像ID3]:删除指定镜像
docker rmi -f docker images -q
:删除所有的镜像
2.3.5 docker load [-i | < ] 镜像:导入镜像
-i:跨操作系统使用
2.3.6 重命名镜像名称和tag
docker tag imageId repository:tag
#或
docker tag old_image new_image
2.4 Docker容器命令
2.4.1 docker run [可选参数] 镜像名:运行容器
參數 | 描述 |
---|---|
–name=“xxx” | 容器名称 |
-d | 后台模式运行 |
-it | 使用交互模式运行,进入容器查看内容 |
-p(小写) | 指定端口映射:-p XXXX |
-P(大写) | 随机端口映射 |
–net | 设置网络(常见:–net host) |
-v | 挂载 |
-e | 设置环境变量 |
–restart | 重启时操作(常见:–restart=always,重启时启动容器) |
2.4.2 docker ps [可选参数]:列出运行的容器
2.4.3 exit:容器直接退出
2.4.4 docker rm -f 容器ID:删除指定容器
docker rm -f docker ps -aq
:删除所有容器
2.4.5 docker start 容器ID:启动容器
2.4.6 docker restart 容器ID:重启容器
2.4.7 docker stop 容器ID:停止正在运行的容器
2.4.8 docker kill 容器ID:强制停止
2.5 Docker其它命令
2.5.1 docker logs -tf 容器ID:查看日志(-t 查看日誌產生的日期; -f 查看實時日誌;–tail=n 查看最後n條日誌,–since=“xxxxxx”查看某时间后的日志)
2.5.2 docker top 容器ID:查看容器中的进程信息
2.5.3 docker inspect 容器ID:查看镜像的元数据
三, Docker部署Java项目
3.1 DockerFile指令
FROM # 基礎鏡像, 一切從這裡開始構建
MAINTAINER # 鏡像是誰寫的, 姓名+郵箱
RUN # 鏡像構建的時候需要運行的命令
WORKDIR # 鏡像的工作目錄
VOLUME # 掛載的目錄
EXPOSE # 保留端口配置
CMD # 指定這個容器啟動的時候要執行的命令, 只有最後一個會生效, 可被替代
ENTRYPOINT # 指定這個容器啟動的時候要執行的命令, 可以追加命令
ONBUILD # 當構建一個唄繼承DockerFile, 這個時候就會運行onbuild的指令, 觸發指令
COPY # 類似ADD, 將我們文件拷貝到鏡像中
ENV # 構建的時候設置環境變量
3.2 部署Java項目
第一步 : 先将Spring Boot项目打包成 .jar
第二步 : 再编写Dockerfile文件
FROM java-jre
VOLUME /tmp
COPY microservice-docker-8091-1.0-SNAPSHOT.jar app.jar
RUN bash -c "touch /app.jar"
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar", "--spring.profiles.active=test", "> /log/app.log"]
解释:
FROM java-jre #FROM指令指定一个已经存在的镜像,告诉Docker后续的指令都是在这个基础上进行的。例如:FROM java:8表示使用 Jdk1.8 环境为基础镜像进行构建镜像。
VOLUME /tmp #VOLUME ,VOLUME 指向了一个/tmp的目录,由于Spring Boot使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
COPY microservice-docker-8091-1.0-SNAPSHOT.jar app.jar #COPY ,拷贝文件到docker容器并且重命名
RUN bash -c "touch /app.jar" #修改這個文件的訪問時間和修改時間為當前時間
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar", "--spring.profiles.active=test", "--server.port=8080", "> /log/app.log"] #ENTRYPOINT,为了缩短Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为ENTRYPOINT。
第三步 : 创建docker文件夹,将 .jar和Dockerfile放在文件夹中。
第四步 : 切换目录到docker中,执行命令:
docker build -t firstdocker .
解释:
- firstdocker:自定义创建镜像名
- . :当前目录
第五步 : 再运行docker镜像,执行命令:
docker run -p 8080:8080 镜像名
或
docker run -d --net host --name 自定義容器名 鏡像名稱
将容器的8080端口(後面)映射到主機的8080端口(前面)
3.3 其他操作
進入啟動容器查看內部目錄結構
# 查看已啟動容器, 獲取容器ID
docker ps
# 進入目錄
docker exec -it 容器ID/名稱 /bin/bash
3.3.1 鏡像/容器導入導出
鏡像導入導出
-
使用save和load
# 導出鏡像 docker save 鏡像ID > 本地目錄路徑(xxx.tar) # 導入鏡像 docker load < 本地鏡像目錄
-
export和import
# 導出鏡像 docker export 容器ID > 本地目錄路徑 # 導入鏡像 docker import 鏡像名稱 < 本地容器目錄
區別 :
export導出的鏡像文件體積小於save保存的鏡像
docker import可以為鏡像指定新名稱, load不能
docker export不支持將多個鏡像打包, save可以
docker export/import 是根據容器拿到的鏡像, 僅保存當時的快照狀態, 會丟失歷史記錄, 無法進行回滾. save/load沒有丟失鏡像的歷史, 可以回滾到之前的layer
export主要用來製作基礎鏡像, 作為基礎的開發環境, save常為客戶服務器直接使用
從遠程複製docker鏡像到本地服務器下
scp root@ip:/遠程路徑 本地路徑
将本地docker打包文件複製到遠程服務器中
scp 本地路徑 user@ip:遠程路徑
3.3.2 容器內時間與服務器不一致
解決方法:
把宿主機的時區與時間綁定到容器內
docker運行命令加上:
-v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime
若宿主機不存在timezone或timezone變成文件夾,則需要先做好一些提前配置
echo 'Asia/Shanghai' > /etc/timezone
#或
echo 'Asia/Shanghai' > /etc/timezone/timezone
3.3.3 倉庫
從倉庫中獲取鏡像:
docker pull xx.xx.xx.xx:xxxx/imageName
提交鏡像到倉庫:
docker push xx.xx.xx.xx:xxxx/imageName
查看倉庫鏡像:
curl -X GET xx.xx.xx.xx:xxxx/v2/_catalog
查看一个镜像的tag
# imageName 鏡像名稱
curl -X GET xx.xx.xx.xx:xxxx/v2/imageName/tags/list
獲取鏡像sha256
# imageName 鏡像名稱
# tag 版本
curl --header "Accept:application/vnd.docker.distribution.manifest.v2+json" -I -XGET xx.xx.xx.xx:xxxx/v2/imageName/manifests/tag
刪除倉庫的鏡像
# imageName 鏡像名稱
# sha256 鏡像sha256值
curl --header "Accept:application/vnd.docker.distribution.manifest.v2+json" -I -X DELETE xx.xx.xx.xx:xxxx/v2/imageName/manifests/sha256
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81618.html