wuyuedefeng / blogs

博客文章在issue中
5 stars 0 forks source link

Docker基础 [Learn] #4

Open wuyuedefeng opened 5 years ago

wuyuedefeng commented 5 years ago

本文档以 ubuntu 16.04为例

安装与启动

安装

$ wget -qO- https://get.docker.com/ | sh

当要以非root用户可以直接运行docker时,需要执行 sudo usermod -aG docker username 命令,然后重新登陆

启动docker 后台服务

$ sudo service docker start

基础知识

docker run

Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。 eg:

$ [sudo] docker run ubuntu:15.10 /bin/echo "Hello world"

运行交互式的容器

$ [sudo] docker run -i -t ubuntu:15.10 /bin/bash

此时我们已进入一个 ubuntu15.10系统的容器, 我们尝试在容器中运行命令 cat /proc/versionls分别查看当前系统的版本信息和当前目录下的文件列表, 我们可以通过运行exit命令或者使用CTRL+D来退出容器。

启动容器(后台模式)

使用以下命令创建一个以进程方式运行的容器

$ [sudo] docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

在输出中,我们没有看到期望的"hello world",而是一串长字符 2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63 这个长字符串叫做容器ID,对每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么。

首先,我们需要确认容器有在运行,可以通过 docker ps 来查看

$ [sudo] docker ps

在容器内使用docker logs命令,查看容器内的标准输出

$ [sudo] docker logs 2b1b7a428627
// 或者
$ [sudo] docker logs amazing_cori

停止容器

我们使用 docker stop 命令来停止容器:

[sudo] docker ps
[sudo] docker stop amazing_cori

可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法

Docker 容器使用

Docker 镜像使用

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载

列出镜像列表

使用 docker images 来列出本地主机上的镜像

$ [sudo] docker images   

各个选项说明:

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有15.10、14.04等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

所以,我们如果要使用版本为15.10ubuntu系统镜像来运行容器时,命令如下:

$ [sudo] docker run -t -i ubuntu:15.10 /bin/bash 

获取一个新的镜像

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。

$[sudo] docker pull ubuntu:13.10

下载完成后,我们可以直接使用这个镜像来运行容器。

查找镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/ 我们也可以使用 docker search 命令来搜索镜像

$ [sudo] docker search httpd

拖取镜像

$ [sudo] docker pull httpd
$ [sudo] docker run httpd

创建镜像

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  1. 从已经创建的容器中更新镜像,并且提交这个镜像
  2. 使用 Dockerfile 指令来创建一个新的镜像

更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器。

$ [sudo] docker run -t -i ubuntu:15.10 /bin/bash

在运行的容器内使用 apt-get update 命令进行更新。 在完成操作之后,输入 exit命令来退出这个容器。

此时ID为e218edb10161的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit来提交容器副本。

$ [sudo] docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2

各个参数说明:

我们可以使用 docker images 命令来查看我们的新镜像 runoob/ubuntu:v2:

$ [sudo] docker images

使用我们的新镜像 runoob/ubuntu 来启动一个容器

$ [sudo] docker run -t -i runoob/ubuntu:v2 /bin/bash  

构建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

runoob@runoob:~$ cat Dockerfile 
FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。 第一条FROM,指定使用哪个镜像源 RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。 然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

$ [sudo] docker build -t runoob/centos:6.7 .

使用docker images 查看创建的镜像已经在列表中存在 我们可以使用新的镜像来创建容器

$ [sudo] docker run -t -i runoob/centos:6.7  /bin/bash

设置镜像标签

我们可以使用 docker tag 命令,为镜像添加一个新的标签。

$ [sudo] docker tag 860c279d2fec runoob/centos:dev

docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。 使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。

容器连接

网络端口映射

我们创建了一个 python 应用的容器。

$ docker run -d -P training/webapp python app.py

们使用 -P 参数创建一个容器,使用 docker ps 可以看到容器端口 5000 绑定主机端口 32768。 我们也可以使用 -p 标识来指定容器端口绑定到主机端口。

另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。

$ [sudo ]docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py

这样我们就可以通过访问 127.0.0.1:5001 来访问容器的 5000 端口。

上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。

$ [sudo] docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

docker port 命令可以让我们快捷地查看端口的绑定情况。

$ [sudo] docker port adoring_stonebraker 5000

Docker容器连接 端口映射并不是唯一把 docker 连接到另一个容器的方法。 docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。 docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。

容器命名

当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 --name 标识来命名容器,例如:

$ [sudo] docker run -d -P --name runoob training/webapp python app.py

我们可以使用 docker ps 命令来查看容器名称。

$ [sudo] docker ps -l
wuyuedefeng commented 3 years ago

Dockerfile中多个From的应用

使用多FROM指令可以完成多阶段编译。每一条 FROM 指令都是一个构建阶段,多条 FROM 就是多阶段构建,虽然最后生成的镜像只能是最后一个阶段的结果,但是,能够将前置阶段中产生的文件拷贝到后边的阶段中,这就是多阶段构建的最大意义。

https://blog.csdn.net/weixin_44843859/article/details/111695012 https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247553210&idx=3&sn=68f67ff55536424fc99a64fee7067fc5&chksm=e8fd8cb3df8a05a52d182deaebc4532547deabaca20a349454146a0efd07c33b1a32b5f817fa&scene=21#wechat_redirect

eg:

FROM node:10-alpine AS build
WORKDIR /app
COPY app /app
RUN npm install && npm run build  

FROM nginx:stable-alpine
# 从From为build的构建中拷贝数据.
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]