Docker使用学习---- 简介&常用命令
Docker 作为一个开源的虚拟化容器平台,可用于各种微服务环境搭建;对于windows来说在本地安装dockerDesktop并线上注册好dockerHub(如同github一样使用)即可很好的使用该工具。
对于docker有这样两个概念:
- 镜像:(image)可从dockerhub上拉取现成的也可由dockerfile 编译而来;
- 容器:(container)从镜像生成的容器,可直接使用;一个镜像可生成多个容器实例;
安装docker现在较为一键傻瓜,安装docker官网的desktop即可;
docker官网
安装好并且确保wsl是可以使用的,如下图所示
1.获取镜像:
1.1 从官方镜像源拉取镜像:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
可以拉取镜像ubuntu20.04,其中可以带上版本号20.04。
拉取完镜像后可在dockerDesktop里面也可以看到,也可以使用命令行查看该镜像:
docker image ls #查看现有镜像
可看到一个镜像其有REPOSITORY,TAG,IMAGE ID,CREATED和SIZE 这几个特征。
如果想要删除该镜像,可根据其ID 删除该镜像:
docker rmi b8f176fa3f0d
由于拉取镜像时ubuntu的latest 和20.04 ID 是重复的,可使用repository:tag 来进行删除
docker rmi ubuntu:latest
1.2 使用dockfile 进行编译镜像:
可在官网复制Dockfile到本地并对其进行编译:
docker build [OPTIONS] PATH | URL | -
–file , -f Name of the Dockerfile (Default is ‘PATH/Dockerfile’)
使用dockfile进行编译时需要将选项改成-f。docker build 官方文档:docker build
可使用路径(线下)来编译,也可使用URL (线上)来编译得到。
比如使用Dockfile(在当前路径)来编译得到镜像。
docker build -f Dockfile . # . 表示为当前路径
如果使用路径编译的话,Dockfile需要在该路径的根上且ADD 的包都需在本地有;
ADD ubuntu-focal-oci-amd64-root.tar.gz /
如果使用URL 编译的话,git 对应代码仓如下所示:
但是比较容易出现Dockfile文件结束符(可能是dos EOF)与线下bash 格式不兼容(unix EOF)。
比较建议的还是下载下来编。
如果遇到eof 不兼容报错可使用vim查询修改文件编码格式
:set ff 查看当前文本的模式类型,一般为dos,unix
:set ff=dos 设置为dos模式, 也可以用 sed -i ‘s/$/\r/’
:set ff=unix 设置为unix模式,也可以用一下方式转换为unix模式
:sed -i ‘s/. $//g’
下载下来编之后会使得生成的镜像repo 名为none,tag 也为none;
可tag该镜像
docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] #SOURCE_IMAGE 可使用ID 来替代
docker image tag SOURCE_IMAGE_ID TARGET_IMAGE[:TAG]
如果需要自定义镜像的话很多需要自定义编写Dockfile ,初学及简单应用可参考菜鸟教程:
Dockfile 编写简介
2 从镜像生成容器(容器引用镜像)
2.1生成容器
docker create --name CONTAINER_NAME IMAGE:TAG
如:
生成后可查看下该容器:
docker ps -a #查看当前所有容器及其状态
2.2 启动容器
docker start con_ubuntu2004 #启动镜像
docker exec -it con_ubuntu2004 bash #进入容器的bash
注:我在win 下使用git-bash.exe 运行docker exec 时候遇到报错:
TTY 是 Teletype 或 Teletypewriter 的缩写,原来是指电传打字机,后来这种设备逐渐键盘和显示器取代。不管是电传打字机还是键盘显示器,都是作为计算机的终端设备存在的,所以 TTY 也泛指计算机的终端(terminal)设备。为了支持这些 TTY 设备,Linux 实现了一个叫做 TTY 的子系统。所以 TTY 既指终端,也指 Linux 的 TTY 子系统。
这里如果使用powershell 或者cmd终端执行上条命令应该没有这些问题,win没有linux 的tty ,因此使用wintty即可。
我在这里遇到一个容器无法start的问题,容器在终端start就闪退exit(0),但是在desktop gui上点击生成一个容器再重命名该容器就可以是up的状态。
想要修改容器名
docker rename CONTAINER_ID CONTAINER_NEWNAME
2.3 容器内外交互
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
docker cp 可将主机和容器之间实现相互拷贝,需要注意的是本地路径按照平常使用,容器内路径需要前面加一个 CONTAINER:
2.4 将容器打包成镜像
如果Dockfile 生成的层级太多或者说比如使用openFoam或者netkar++等这些需要自主配置多个支持依赖的也可以先在简单基础容器内编译配置好openFoam这些然后再打包commit成镜像,也可推到dockerHub自己建个仓回头好拉。