docker基础——理解容器和镜像

贴一篇入门文章:https://blog.csdn.net/deng624796905/article/details/86493330

官方安装文档 : https://docs.docker.com/install/linux/docker-ce/centos/

安装docker-ce(社区版)(安装blog : https://www.cnblogs.com/yufeng218/p/8370670.html )

安装依赖
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装
yum install docker

简约安装
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh

开机启动,启动
systemctl enable docker
systemctl start docker

查看信息,版本
docker info
docker version

 

 

看到 Docker 客户端的所有命令选项
docker
查看具体命令
docker command –help

容器相关

docker ps  / docker ps -a
启动,停
docker start container_name/container_id
docker restart container_name/container_id
docker stop container_name/container_id

这个时候我们如果想进入到这个容器中,我们可以使用 attach 命令:

docker attach container_name/container_id

那如果我们想运行这个容器中的镜像的话,并且调用镜像里面的 bash ,我们可以使用如下命令:

docker run -t -i container_name/container_id /bin/bash

 

镜像

运行一个web应用
docker pull training/webapp # 载入镜像
docker run -d -P training/webapp python app.py

Docker 在容器内运行应用程序
docker run ubuntu:15.10 /bin/echo “Hello world”

运行交互式的容器
docker run -i -t ubuntu:15.10 /bin/bash
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。

启动容器(后台模式)
docker run -d ubuntu:15.10 /bin/sh -c “while true; do echo hello world; sleep 1; done”
-d:后台模式启动容器

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

停止容器
docker stop 2b1b7a428627
docker stop amazing_cori

运行一个web应用
docker pull training/webapp # 载入镜像
docker run -d -P training/webapp python app.py
-d:让容器在后台运行。
-P:将容器内部使用的网络端口映射到我们使用的主机上。

docker ps
多了一列
PORTS
0.0.0.0:32769->5000/tcp
表示: Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。

我们也可以通过 -p 参数来设置不一样的端口:
runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py
容器内部的 5000 端口映射到我们本地主机的 5000 端口上。

netstaus -tlnp
tcp6 0 0 :::32768 :::* LISTEN 19689/docker-proxy

docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号
docker port 654519bcb05b
docker port heuristic_williamson

docker logs [ID或者名字] 可以查看容器内部的标准输出。
docker logs -f bf08b7f2cd89

查看WEB应用程序容器的进程
docker top wizardly_chandrasekhar

使用 docker inspect 来查看 Docker 的底层信息
docker inspect wizardly_chandrasekhar

停止 WEB 应用容器
docker stop wizardly_chandrasekhar

重启WEB应用容器
docker start wizardly_chandrasekhar

移除WEB应用容器
我们可以使用 docker rm 命令来删除不需要的容器
runoob@runoob:~$ docker rm wizardly_chandrasekhar
wizardly_chandrasekhar
删除容器时,容器必须是停止状态,否则会报如下错误

==== Docker 镜像使用 ====
使用 docker images 来列出本地主机上的镜像。
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 5 months ago 1.84kB
training/webapp latest 6fae60ef3446 4 years ago 349MB

各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本
要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
docker run -t -i ubuntu:15.10 /bin/bash

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

查找镜像
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像
docker search httpd
说明:
NAME:镜像仓库源的名称
DESCRIPTION:镜像的描述
OFFICIAL:是否docker官方发布
docker pull httpd
docker run httpd

创建镜像
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
1.从已经创建的容器中更新镜像,并且提交这个镜像
2.使用 Dockerfile 指令来创建一个新的镜像
docker run -t -i ubuntu:15.10 /bin/bash
apt-get update
exit
docker commit -m=”has update” -a=”runoob” e218edb10161 runoob/ubuntu:v2
docker images

cat Dockerfile
docker build -t runoob/centos:6.7 .

设置镜像标签
docker tag 860c279d2fec runoob/centos:dev

==== Docker 容器连接 ====

网络端口映射
docker run -d -P training/webapp python app.py (大写-P)
docker run -d -p 5000:5000 training/webapp python app.py (小写-p)
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py (指定容器绑定的网络地址:绑定127.0.0.1)
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py (默认是tcp端口,改绑定udp端口)

容器命名 –name
docker run -d -P –name runoob training/webapp python app.py

 

Dockerfile 创建镜像

一般来说,我们可以将 Dockerfile 分为四个部分:
基础镜像(父镜像)信息指令 FROM
维护者信息指令 MAINTAINER
镜像操作指令 RUN 、 EVN 、 ADD 和 WORKDIR 等
容器启动指令 CMD 、 ENTRYPOINT 和 USER 等

FROM <image> or FORM <image>:<tag>
MAINTAINER <name>
COPY . /app #拷贝当前目录到容器中的 /app 目录下
WORKDIR /app #WORKDIR 用于配合 RUN,CMD,ENTRYPOINT 命令设置当前工作路径。可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令。默认路径为/
RUN pip install -r requirements.txt # RUN 用于容器内部执行命令、EXPOSE
EXPOSE 5000 #EXPOSE 命令用来指定对外开放的端口。一般格式为 EXPOSE <port> [<port>…]
ENTRYPOINT 可以让你的容器表现得像一个可执行程序一样。一个 Dockerfile 中只能有一个 ENTRYPOINT,如果有多个,则最后一个生效。

CMD
CMD 命令用于启动容器时默认执行的命令,CMD 命令可以包含可执行文件,也可以不包含可执行文件。不包含可执行文件的情况下就要用 ENTRYPOINT 指定一个,然后 CMD 命令的参数就会作为ENTRYPOINT的参数。
CMD 命令有三种格式:
CMD [“executable”,”param1″,”param2″]:推荐使用的 exec 形式。
CMD [“param1″,”param2”]:无可执行程序形式
CMD command param1 param2:shell 形式。
一个 Dockerfile 中只能有一个CMD,如果有多个,则最后一个生效。而 CMD 的 shell 形式默认调用 /bin/sh -c 执行命令。

完整实例

FROM python:2.7
MAINTAINER youname <111111@gmail.com>
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python"]
CMD ["app.py"]

 

创建nginx-web的镜像*(亲测)

mkdir -p ~/docker/tt_web
cd ~/docker/tt_web
touch Dockerfile
vim Dockerfile

#下面是Dockerfile的内容

FROM nginx
MAINTAINER kiwi <ps_0921@126.com>
RUN echo '<h1>Hello, Docker! Kiwi here</h1>' > /usr/share/nginx/html/index.html

在Dockerfile目录执行下面命令(后面有个点)

docker build -t fkiwi/nging_web:v1 .

参数-t说明

-t 是为新镜像设置仓库和名称,其中 fkiwi 为仓库名, nging_web 为镜像名, :v1为标签(不添加为默认 latest )

成功提示

Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM nginx
---> 719cd2e3ed04
Step 2/3 : MAINTAINER kiwi <ps_0921@126.com>
---> Running in cd631eb2bf5f
Removing intermediate container cd631eb2bf5f
---> 780ebb18ac1b
Step 3/3 : RUN echo '<h1>Hello, Docker! Kiwi here</h1>' > /usr/share/nginx/html/index.html
---> Running in 4a292caeb922
Removing intermediate container 4a292caeb922
---> b9b33fb2c7bf
Successfully built b9b33fb2c7bf
Successfully tagged fkiwi/nging_web:v1

查看镜像

docker images
fkiwi/nging_web v1 b9b33fb2c7bf 10 seconds ago 109MB

用刚才的镜像启动容器(镜像名nging_web 写错了,尴尬)

docker run --name kiwi-nginx-tt -d -p 8084:80 fkiwi/nging_web:v1

浏览器访问 http://192.168.2.108:8084/, 出现 ‘<h1>Hello, Docker! Kiwi here</h1>’  ,成功!

 

其他命令

exec

在容器 mynginx 中开启一个交互模式的终端:

docker exec -i -t mynginx /bin/bash

对指定的容器执行 bash:

docker exec -it 9df70f9a0714 /bin/bash