读书笔记---《Docker 技术入门与实践》---其一

一、镜像
1.1、搜索

搜索所有nginx镜像

$ docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 11305 [OK] 
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1588 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 709 [OK]
jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… 506 [OK]
webdevops/php-nginx Nginx with PHP-FPM 125 [OK]
zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi… 98 [OK]
bitnami/nginx Bitnami nginx Docker Image 65 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 59 
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 50 [OK]
zabbix/zabbix-web-nginx-pgsql Zabbix frontend based on Nginx with PostgreS… 33 [OK]
tobi312/rpi-nginx NGINX on Raspberry Pi / ARM 26 [OK]
nginx/nginx-ingress NGINX Ingress Controller for Kubernetes 18 
schmunk42/nginx-redirect A very simple container to redirect HTTP tra… 15 [OK]
nginxdemos/hello NGINX webserver that serves a simple page co… 14 [OK]
blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 12 [OK]
wodby/drupal-nginx Nginx for Drupal container image 12 [OK]
centos/nginx-18-centos7 Platform for running nginx 1.8 or building n… 10 
centos/nginx-112-centos7 Platform for running nginx 1.12 or building … 7 
nginxinc/nginx-unprivileged Unprivile ged NGINX Dockerfiles 4 
1science/nginx Nginx Docker images that include Consul Temp… 4 [OK]
mailu/nginx Mailu nginx frontend 3 [OK]
travix/nginx NGinx reverse proxy 2 [OK]
toccoag/openshift-nginx Nginx reverse proxy for Nice running on same… 1 [OK]
ansibleplaybookbundle/nginx-apb An APB to deploy NGINX 0 [OK]
wodby/nginx

 

按条件搜索

--filter=[]

 

搜索官方nginx镜像

$ docker search --filter=is-official=true nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 11305 [OK]

 

搜索收藏数高于100的镜像

$ docker search --filter=stars=100 nginx
NAME                                     DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                                    Official build of Nginx.                        11305               [OK]                
jwilder/nginx-proxy                      Automated Nginx reverse proxy for docker con…   1588                                    [OK]
richarvey/nginx-php-fpm                  Container running Nginx + PHP-FPM capable of…   709                                     [OK]
jrcs/letsencrypt-nginx-proxy-companion   LetsEncrypt container to use with nginx as p…   506                                     [OK]
webdevops/php-nginx                      Nginx with PHP-FPM                              125                                     [OK]

 

1.2、prune
用于删除系统中遗留的临时镜像文件,以及没有被使用的镜像

$ docker image prune -f 
Total reclaimed space: 0B

 

1.3、导出导入镜像
首先从镜像源下载镜像

$  docker pull ubuntu:18.04

 

通过save命令导出镜像为tar包

$ docker save -o ubuntu_18.04.tar ubuntu:18.04

 

删除镜像

$ docker rmi ubuntu:18.04

 

使用cat结合import命令导入镜像

$ cat ubuntu_18.04.tar | docker import - ubuntu:18.04

 

也可以使用下面命令导入镜像

$ docker load < ubuntu_18.04.tar 

 

1.4、push上传到镜像库

首先打开docker hub的网站进行注册
https://hub.docker.com

 

之后登陆网站,点击 “Create Repository” 创建仓库, 仓库名即为自己的用户名 XXXXX,填写 “Name” 即仓库下一级的文件名 ubuntu,选择 “Public”,设置为公开模式。

 

把要上传的镜像打上标记

$ docker tag ubuntu:latest XXXXX/ubuntu:latest

 

登陆库,输入账户名和密码

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: XXXXX
Password: 

 

上传镜像

$ docker push XXXXX/ubuntu:latest

 

再次查看镜像库网站,发现已经上传完成。

 

二、容器

2.1、create 容器

只是创建容器,不启动,如果没有要启动的镜像,则需要自动pull下镜像,然后再创建容器

$ docker create -it ubuntu:latest

 

启动需要start

首先查看镜像,ps 是查看运行的容器,加上 -a 参数会查询所有的容器

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
553fe2651182        ubuntu:latest       "/bin/bash"              6 seconds ago       Created                                       brave_joliot

 

启动容器,加上容器ID或者容器名

$ docker start 553fe2651182

 

使用run创建并启动

$ docker run -it ubuntu:latest

 

2.2、暂停容器

后台启动容器

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

 

查看日志发现一直在输出信息,c1f7afa8a509 是容器ID

$ docker logs -f c1f7afa8a509

 

暂停容器运行

$ docker pause c1f7afa8a509

 

暂停之后使用 docker ps 查看发现容器还在,但是状态变为 Paused,另外查看日志发现不在滚动了。

 

2.3、-t、--time 等待指定时间后再终止容器运行,默认 10 秒

$ docker stop --time=5 c1f7afa8a509

 

2.4、prune 清除处于停止状态的容器

$ docker container prune

 

2.5、进入容器

attach:
同时多个窗口进入同一个容器时,所有窗口都是同步显示的,一个窗口阻塞了,其他窗口也无法执行,这是一个弊端吧。

 

exec:
1.3.0版本后多了上边的这个命令,可以再运行的容器内执行任意命令。

 

重要的参数:
-d, --detach 在容器中后台执行命令
--detach-keys="" 指定将容器切回后台的按键
-e, --env=[] 指定环境变量列表
-i, --interactive=ture|false 打开标准输入接受用户输入命令,默认值为false
--privileged=ture|false 是否给执行命令以高权限,默认值为false
-t, --tty=ture|false 分配伪终端,默认值为false
-u, --user="" 执行命令的用户名或ID

 

例如下面的例子:

$ docker exec -it 553fe2651182 /bin/bash

进入容器,启动bash,但是并不影响其他打开的窗口。

 

2.6、导入导出

可以使用 -o 参数,或者使用重定向导出容器

进入容器,创建目录,文件,写入文件内容

export 导出容器

下面两种方式都可以

$ docker export -o running_ubuntu1.tar 553fe2651182
$ docker export 553fe2651182 >running_ubuntu2.tar

 

import 导入容器文件为镜像

$ docker import running_ubuntu1.tar test/ubuntu:v1.0
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu         v1.0                c24420ad0828        8 seconds ago       81.5MB

 

运行容器

$ docker run -it test/ubuntu:v1.0 /bin/bash

 

查看目录文件及文件内容,都和之前的一样。

 

load和import的区别,import导入的方式,容器快照文件丢失了所有的历史记录和元数据信息,仅保存当时的容器快照状态,而镜像存储文件将保存完整记录,体积更大,另外从容器快照导入时可以重新指定标签等元数据信息。

 

2.7、查看容器信息

查看容器进程

$ docker top 553fe2651182
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                5562                5546                0                   11:03               pts/0               00:00:00            /bin/bash
root                6339                5546                0                   14:18               pts/1               00:00:00            /bin/bash

 

查看统计信息

$ docker stats 553fe2651182
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
553fe2651182        brave_joliot        0.00%               844KiB / 1.789GiB   0.05%               648B / 0B           0B / 0B             2

 

查看容器内数据修改

$ docker container diff 553fe2651182
A /data
A /data/data
A /data/data/test1.txt
A /data/data1
A /data/data1/test2.txt
A /data/test.txt

 

查看容器端口映射

$ docker container port 553fe2651182

 

2.8、本地和容器拷贝文件

本地创建目录,文件,输入内容到文件,把本地文件拷贝到容器。

$ docker cp data 553fe2651182:/data/

把当前目录下 data 目录拷贝到容器 /data 目录,之后在容器上发现目录 data 及文件,文件内容一致

 

在容器创建目录,文件,输入内容到文件,把容器文件拷贝到本地。

$ docker container cp 553fe2651182:/data/data1 .

把容器 /data/data1 目录拷贝到当前目录,之后在当前目录下发现目录 data1 及文件,文件内容一致。

 

三、数据管理

对数据进行持久化,或者需要在多个容器之间进行数据共享,就涉及到容器的数据管理操作。

管理数据方式:
1)数据卷(Data Volumes): 容器内数据直接映射到本地主机环境
2)数据卷管理(Data Volumes Containers): 使用特定容器维护数据卷

 

数据卷:
一个可供容器使用的特殊目录,将主机操作系统目录直接映射进容器,类似Linux中mount。

创建数据卷

$ docker volume create -d local test

 

3.1、数据卷容器

创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata

$ docker run -d -it -v /dbdata --name dbdata ubuntu

 

然后,创建其他两个容器使用 --volumes-from 来挂载dbdata容器中的数据卷

$ docker run -d -it --volumes-from dbdata --name db1 ubuntu

$ docker run -d -it --volumes-from dbdata --name db2 ubuntu

 

进入容器dbdata

$ docker exec -it CONTAINER_ID /bin/bash

 

进入目录 dbdata ,创建文件 test

结果进入其他两个容器的 dbdata目录,也存在test文件

 

3.2、利用数据卷容器来迁移数据

使用下面命令来备份数据卷容器dbdata内的数据卷

$ docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata

 

说明:
利用ubuntu镜像创建一个容器worker,使用 --volumes-from dbdata 参数来让worker容器挂载dbdata数据卷;使用 -v $(pwd):/backup 参数来挂载本地的当前目录到worker容器的/backup 目录 。

 

worker容器启动后,使用tar cvf /backup/backup.tar /dbdata 命令将/dbdata 下内容备份为容器的/backup/backup.tar,即宿主机当前目录下的backup.tar。

 

四、端口映射和容器互联

 

4.1、外部访问容器应用

-p或者-P 参数指定端口映射,-P(大写),docker会随机映射一个49000~49900的端口到内部开放的网络端口:

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

 

使用 docker ps 可以查看本地主机和docker容器的端口信息,可以看到本地主机的32768映射到了容器的5000端口。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
d3fc4f8e721b        training/webapp     "python app.py"     9 seconds ago       Up 7 seconds        0.0.0.0:32768->5000/tcp   jolly_turing

 

-p(小写)可以指定要映射的端口,一个指定端口上只可以绑定一个容器,映射本地5000端口到容器5000端口,默认绑定的本地的所有地址:

$ docker run -d -p 5000:5000 training/webapp python app.py
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES
cc2c5af48a89        training/webapp     "python app.py"     4 minutes ago       Up 4 minutes        0.0.0.0:5000->5000/tcp                         mystifying_colden

 

绑定多个端口

$ docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py

 

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES
f57b63b16bde        training/webapp     "python app.py"     4 seconds ago       Up 3 seconds        0.0.0.0:3000->80/tcp, 0.0.0.0:5001->5000/tcp   reverent_payne

 

映射指定地址的指定端口

$ docker run -d -p 127.0.0.1:5002:5000 training/webapp python app.py

 

绑定 localhost 的任意端口到容器的5000 udp端口,本地主机自动分配一个端口

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

 

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES
b00e96919a9e        training/webapp     "python app.py"     6 seconds ago       Up 5 seconds        5000/tcp, 127.0.0.1:32768->5000/udp            jolly_cori

 

可以使用docker port 来查看当前映射的端口配置,可以看到绑定的本地地址和端口

$ docker port jolly_cori 5000/udp
127.0.0.1:32768

 

4.2、互联机制实现便捷互访

创建数据库容器,--name 是为容器命名,容器的名称是唯一的

$ docker run -d --name db training/postgres

 

创建web容器,并连接到db容器,--link 参数格式是 --link name:alias ,name 是容器名称,alias 是别名

$ docker run -d -P --name web --link db:db training/webapp python app.py

 

env 可以查看web容器的环境变量

$ docker run --rm --name web2 --link db:db training/webapp env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=727e6c623a3f
DB_PORT=tcp://172.17.0.8:5432
DB_PORT_5432_TCP=tcp://172.17.0.8:5432
DB_PORT_5432_TCP_ADDR=172.17.0.8
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_PG_VERSION=9.3
HOME=/root

 

进入web容器

$ docker run -t -i --rm --link db:db training/webapp /bin/bash

 

查看web容器的hosts文件

root@b9d26daaf8eb:/opt/webapp# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.8      db 6e043f32681a
172.17.0.9      b9d26daaf8eb

这里有两个hosts信息,第一个是db容器,第二个是web容器

 

ping命令测试和db容器的连通

首先安装工具,然后执行ping命令

root@b9d26daaf8eb:/opt/webapp# apt-get install -yqq inetutils-ping
root@b9d26daaf8eb:/opt/webapp# ping db
PING db (172.17.0.8): 56 data bytes
64 bytes from 172.17.0.8: icmp_seq=0 ttl=64 time=0.311 ms
64 bytes from 172.17.0.8: icmp_seq=1 ttl=64 time=0.115 ms
64 bytes from 172.17.0.8: icmp_seq=2 ttl=64 time=0.109 ms

会把容器名解析为地址

 

用户可以链接多个子容器到父容器,比如可以链接多个web到同一个db容器。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值