Docker
安装
在windows下安装docker 的前提可能是要先安装 Hyper-V 虚拟机,
因为 Docker 就是运行在 Hyper-V 虚拟机上的
本地项目
新建一个项目
编译发布
在发布的目录中新增一个 DockerFile
命令: (版本18.03.1)
查找一个镜像
docker search xxxxxx
镜像都是按照 用户名/ 镜像名的方式来存储的。有一组比较特殊的镜像,比如ubuntu这类基础镜像,经过官方的验证,值得信任,可以直接用 镜像名来检索到。
下载一个镜像
docker pull xxxxxx:<tag>
下载使用 pull 命令, 要写完整的名字, 比如 xxxx/yyyy
此命令默认下载 latest版本
如果要下载某个版本的话
可以先去 hub.docker.com 按照镜像名来查找
运行 hello World
docker run learn/tutorial echo "helllo world"
安装命令
$docker run learn/tutorial apt-get install -y ping
看明白了吗?. run 命令是基于选择某一个镜像来执行的
这里的 tutorial 其实指的是 ubuntu 操作系统
所以 docker run learn/tutorial 之后的命令就相当于在 这个 ubuntu 上操作命令行一样了
备注:apt-get 命令执行完毕之后,容器就会停止,但对容器的改动不会丢失。
提示:
在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。
保存修改
docker ps -l docker commit 698 learn/ping
当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。
docker中保存状态的过程称之为committing,它保存的新旧状态之间的区别,从而产生一个新的版本
首先使用docker ps -l命令获得安装完ping命令之后容器的id。然后把这个镜像保存为 learn/ping(这个learn/ping是新的镜像名字)。
提示:
1. 运行docker commit,可以查看该命令的参数列表。
2. 你需要指定要提交保存容器的ID。(译者按:通过docker ps -l 命令获得)
3. 无需拷贝完整的id,通常来讲最开始的三至四个字母即可区分。(译者按:非常类似git里面的版本号)
4. 执行完docker commit命令之后,会返回新版本镜像的id号。
运行新的镜像
docker run lean/ping ping www.baidu.com
一定要使用新的镜像名learn/ping来运行ping命令。(译者按:最开始下载的learn/tutorial镜像中是没有ping命令的)
检查运行中的镜像
docker inspect xxx
docker ps命令可以查看所有正在运行中的容器列表,使用docker inspect命令我们可以查看更详细的关于某一个容器的信息。
发布自己的镜像
docker images
docker login <远程仓库地址>:<Tag>
docker push learn/ping
1. docker images命令可以列出所有安装过的镜像。
2. docker push命令可以将某一个镜像发布到官方网站。
3. 你只能将镜像发布到自己的空间下面。这个模拟器登录的是learn帐号。
镜像是一系列只读层的顶层视角
容器是镜像再加一个可读写层的视角
容器相当于我们运行了一个镜像一样, 然后输入了些命令
每个命令会产生一个新的容器, 每个都是相当于个时间分支一样
然后我们可以选择其中一个然后保存为新的镜像
打包, 根据 Dockerfile 创建一个镜像
docker build -t mydockerimages .
参数 -t 指定镜像的名字
比如说这里叫 mydockeriamges
还可以使用参数 -f 来显式的指定 dockerfile 的位置, 如果不使用则为当前目录
执行了这条命令后, docker 会将该上下文目录中(此处就是指命令的 . 也就是当前目录)的文件根据 Dockerfile 打包成镜像
然后传给Docker daemon
其中的 Dockerfile
FROM microsoft/dotnet:2.0-sdk WORKDIR myCore COPY . . EXPOSE 20010 ENV ASPNETCORE_URLS http://192.168.0.76*:20010 ENTRYPOINT ["dotnet", "ForDocker1.dll"]
FROM:
就是基于某个镜像构建这个包
WORKDIR
工作目录, 如果不存在的话 docker 会自动创建
COPY<源路径> <目标路径>:
指令将从构建上下文目录中 <源路径> 的文件或目录复制到新的一层的镜像内的 <目标路径> 位置。
<源路径>所指定的源必须在上下文目录中,即必须是上下文根目录的相对路径!
<目标路径> 可以是容器内的绝对路径,也可以是容器内相对于工作目录的相对路径( 工作目录可以用 WORKDIR指令来指定)。
目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建目录。
这个目标路径是相对于 WORKDIR 的目录来定的
如果目标路径是 x 的话, WORKDIR是 y 的话 那么生成的路径是 /y/x
EXPOSE:
指定 docker run 的端口, 这里指定了20010 的话, 那么 docker run 之后的端口也会是20010 (指docker容器内部的端口)
ENV ASPNETCORE_URLS:
目前没搞明白是干嘛用的, 但是这里指定了 ip 的话, 可以在主机环境下用 ip 来访问
ENTRYPOINT:
要指定运行时候的命令
ADD<源路径><目标路径>:
ADD与COPY指令在功能上十分相似,但是在COPY的基础上增加了一些功能。
比如,源路径可以是一个指向一个网络文件的URL,这种情况下,Docker引擎会试图下载这个URL指向的文件到<目标路径>去。
此外,当<源路径>为一个tar压缩文件时,该压缩文件在被复制到容器中时会被解压提取。但是使用COPY指令只会将tar压缩文件拷贝到<目标路径>中
运行
docker run [参数] [镜像名]
-it: 交互模式, 可以进入到容器的内部
-p <目标端口>:<原始端口>: 设置内外端口的映射 原始端口就是内部的端口
这里要注意的是
直接 run 的话
Dockerfile 里的 ENTRYPOINT 运行命令是针对工作目录来说的
如果COPY还有一层目录的话, 相当于是 工作目录/COPY到的目录 2层目录
Docker 命令集 寻找网络镜像命令 docker search centos [root@test ~]# docker search centos 名字 描述 下载次数 是否官方 是否是Dockerfile构建的 INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMAT docker.io docker.io/centos The official build of CentOS. 3301 [OK] 下载镜像 docker pull centos 查看镜像 docker images 删除镜像 docker rmi 容器命令 启动容器 docker run --name -h hostname 启动容器2 docker start CONTAINER ID 停止容器 docker stop CONTAINER ID 查看容器 docker ps -a 进入容器 docker exec | docker attach 删除容器 docker rm 进入后台运行容器 docker attach 68e5c66ee5c9 退出自动停止运行容器 进入容器 docker run --name mydocker -it docker.io/centos /bin/bash -d 进入后台运行 --run 运行 --name 指定名字 -i 输入终端打开 -t 开一个伪终端 进入容器不退出 1、进入容器 docker run --name mydocker -it docker.io/centos /bin/bash 2、退出 3、启动容器 docker ps -a查询ID号 docker start ID号 4、获取Pid号 docker inspect --format "{{.State.Pid}}" 68e5c66ee5c9 5、进入容器而不退出 nsenter --target 19205 --mount --uts --ipc --net --pid 退出不停止运行容器 如果没有这个命令,需要安装util-linux包 nsenter 6、懒人写法 nsenter --target `docker inspect --format "{{.State.Pid}}" ID` --mount --uts --ipc --net --pid docker 网络访问 docker run -P -P 随机映射 -p hostport:containerPort -p ip:hostPort:containerPort -p ip::containerPort -p hostPort:containerPort -p hostPort:containerPort 数据卷管理 docker -v /data -v /src:/dsrc -v /src:/src:ro 容器的制作 docker commit -m "my nginx" f443e801f545 shijia/my-nginx:v1 Docker file 的方式构建docker镜像 FROM 他的妈妈是谁(基础镜像) MAINTAINER 告诉被人,你创造了他(维护者信息) RUN 你想让他干啥(把命令前面加上RUN) ADD 相当于cp命令(COPY文件,会自动解压) WORKDIR 相当于cd命令(当前工作目录) VOLUME 给我一个放行李的地方(目录挂载) EXPOSE 我要打开的门是啥(端口) RUN 奔跑吧,兄弟!(进程要一直运行下去) Docker 案例 vim /opt/docker-file/nginx/Dockerfile # This is My first Dockerfile # Version 1.0 # Author : Shijia Zhang #Base images FROM centos #MAINTAINER MAINTAINER ShiJia Zhang #ADD ADD pcre-8.37.tar.gz /usr/local/src ADD nginx-1.9.3.tar.gz /usr/local/src #RUN RUN yum -y install wget gcc gcc-c++ make openssl-devel RUN useradd -s /sbin/nologin -M www #WORKDIR WORKDIR /usr/local/src/nginx-1.9.3 #RUN RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-pcre=/usr/local/src/pcre-8.37 && make && make install RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf ENV PATH=/usr/local/nginx/sbin:$PATH EXPOSE 80 CMD ["nginx"] 运行Dockerfile docker build -t nginx-file:v1 /opt/docker-file/nginx/ 其他命令 docker run -it --rm stree --cpu 1 --rm 容器运行完即可删除 --cpu 指定分多少颗CPU
修改仓库
linux 上更改仓库
修改:/etc/docker/daemon.json
增加如下内容
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
windows 上更改仓库