Docker技术研究

文章目录

      • 一、Docker入门
      • 1.Docker对比虚拟机
      • 1.镜像
        • 查看所有镜像
        • docker打标签
        • 查看镜像的详细信息
        • 只搜索关注度1000以上的镜像
        • 删除镜像
        • 导出镜像
        • 导入镜像
        • 上传镜像
      • 2.容器
        • 新建容器
        • 新建并启动容器
        • 守护态运行
        • 仅仅简单启动容器
        • 查看日志
        • 查看实时日志
        • 查询所有容器
        • 查询容器不截取命令
        • 查询容器自定义表格样式
        • 导出容器
        • 导入容器
        • 如何指定容器的工作目录?
      • 3.仓库
        • 公有仓库(阿里云)
        • 1. 登录阿里云Docker Registry
        • 2. 从Registry中拉取镜像
        • 3. 将镜像推送到Registry
        • 4. 选择合适的镜像仓库地址
        • 5. 示例
        • 私有仓库Harbor
      • 4.数据管理
        • 1.创建数据卷容器
        • 2.挂载主机目录作为数据卷
        • 3.记录服务器输入过的命令历史
        • 4.挂载一个本地文件作为数据卷
        • 5.数据卷容器
        • 6.利用数据卷容器迁移数据
        • 7.查看docker消耗空间
      • 5.网络基础配置
        • 1.可以通过-P或者-p参数来指定端口映射。
        • 2.映射到指定地址的任意端口
        • 3.容器互联实现容器间通信--link
      • 6.使用Dockerfile创建镜像
        • 1.from
        • 2.MAINTAINER
        • 3.RUN
        • 4.CMD
        • 5.EXPOSE
        • 6.ENV
        • 7.ADD
        • 8.COPY
        • 9.ENTRYPOINT
        • 10.volumn
        • 11.USER
        • 12.WORKDIR
      • 7.创建镜像
      • 8.创建支持SSH服务的镜像
        • 命令创建
        • Dockerfile创建
        • 配置centos支持SSH访问
      • 9.安装nginx
      • 10.安装Tengine
        • 手写dockerfile

作者 邮箱 时间
潘顾昌 [email protected] 2020/01/12

一、Docker入门

1.Docker对比虚拟机

特性 容器 虚拟机
启动速度 秒级 分钟级
硬盘使用 MB GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个
隔离性 完全隔离 完全隔离

1.镜像

查看所有镜像

[root@choerodon ~]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
liyasthomas/postwoman                                   latest              8fde9049303e        7 days ago          940MB
pigic/hzero-customs                                     1.1.0               c3a7900b623c        2 weeks ago         872MB
pigic/hzero-customs                                     latest              c3a7900b623c        2 weeks ago         872MB
registry.cn-hangzhou.aliyuncs.com/pigic/hzero-customs   1.1.0               09cf05df3868        2 weeks ago         872MB
mysql                                                   5.7                 c4f186b9e038        3 weeks ago         435MB
actiontech/dble                                         latest              206551d47f30        3 months ago        615MB
java                                                    8                   d23bdf5b1b1b        3 years ago         643MB

docker打标签

[root@choerodon ~]# docker tag liyasthomas/postwoman:latest liyasthomas/postwoman:0.0.1 
[root@choerodon ~]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
liyasthomas/postwoman                                   0.0.1               8fde9049303e        7 days ago          940MB
liyasthomas/postwoman                                   latest              8fde9049303e        7 days ago          940MB
pigic/hzero-customs                                     1.1.0               c3a7900b623c        2 weeks ago         872MB
pigic/hzero-customs                                     latest              c3a7900b623c        2 weeks ago         872MB
registry.cn-hangzhou.aliyuncs.com/pigic/hzero-customs   1.1.0               09cf05df3868        2 weeks ago         872MB
mysql                                                   5.7                 c4f186b9e038        3 weeks ago         435MB
actiontech/dble                                         latest              206551d47f30        3 months ago        615MB
java                                                    8                   d23bdf5b1b1b        3 years ago         643MB

查看镜像的详细信息

[root@choerodon ~]# docker inspect -f {{.Id}}  08f
08f0a2ec9505edc26766d91af6eb39e35e74d16af28c0b4082f0cf2f232763eb
[root@choerodon ~]# docker inspect -f {{.Created}}  08f
2020-02-22T05:41:41.81565977Z
[root@choerodon ~]# docker inspect 08f
[
    {
        "Id": "08f0a2ec9505edc26766d91af6eb39e35e74d16af28c0b4082f0cf2f232763eb",
        "Created": "2020-02-22T05:41:41.81565977Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "npm",
            "run",
            "start"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 18531,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-02-22T05:41:42.234648311Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        }
]

只搜索关注度1000以上的镜像

[root@choerodon ~]# docker search mysql --filter=stars=1000
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql               MySQL is a widely used, open-source relation…   9164                [OK]                
mariadb             MariaDB is a community-developed fork of MyS…   3263                [OK]                

删除镜像

[root@choerodon ~]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
liyasthomas/postwoman                                   0.0.1               8fde9049303e        7 days ago          940MB
liyasthomas/postwoman                                   latest              8fde9049303e        7 days ago          940MB
[root@choerodon ~]# docker rmi liyasthomas/postwoman:0.0.1
Untagged: liyasthomas/postwoman:0.0.1
[root@choerodon ~]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
liyasthomas/postwoman                                   latest              8fde9049303e 

可以使用docker rmi -f ubuntu 强行删除镜像

导出镜像

[root@choerodon ~]# docker save -o postwomen.war 8fde9049303e
[root@choerodon ~]# ls
anaconda-ks.cfg  postwomen.war

导入镜像

[root@choerodon ~]# docker load < postwomen.war 
Loaded image ID: sha256:8fde9049303e502a8cf4d3a37110b885f49f14ffdee13512a0cf32fb94478049
或者
#docker load --input postwomen.war 

上传镜像

docker tag test:latest user/test:latest
docker push user/test:latest

2.容器

新建容器

# docker create -it ubuntu:latest

此时新建的容器处于静止状态,可以使用docker start命令启动它。

新建并启动容器

docker run -it ubuntu:14.04 /bin/bash

上面的命令启动一个容器,并启动一个bash终端,允许用户交互

其中,-t选型让docker分配一个伪终端并绑定到容器的标准输入上,

​ -i选型让容器的标准输入保持打开。

守护态运行

用户可以添加-d参数来实现

docker run -d -p 6379:6379 --name redis redis
docker run -d -p 6379:6379 --name redis redis /bin/sh -c "while true; do echo hello world; sleep 1; done"
docker logs reids

仅仅简单启动容器

docker run -d -P --name mybase registry.cn-hangzhou.aliyuncs.com/choerodon-tools/cibase:0.7.0 /bin/sh -c "while true; do echo hello world; sleep 1; done"

查看日志

[root@choerodon docker]# docker logs affectionate_pare

> [email protected] start /app
> nuxt start

ℹ Listening on: http://172.17.0.6:3000/

查看实时日志

[root@choerodon docker]# docker logs -f -t --tail=3 affectionate_pare
2020-02-22T05:41:43.356458638Z ℹ Listening on: http://172.17.0.6:3000/

-f 查看实时日志

-t 显示时间

–tail=3 只显示最后3条记录

查询所有容器

docker ps -a -q

查询容器不截取命令

docker ps -a --no-trunc

查询容器自定义表格样式

docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}"
名称	含义
.ID	容器ID
.Image	镜像ID
.Command	执行的命令
.CreatedAt	容器创建时间
.RunningFor	运行时长
.Ports	暴露的端口
.Status	容器状态
.Names	容器名称
.Label	分配给容器的所有标签
.Mounts	容器挂载的卷
.Networks	容器所用的网络名称

导出容器

[root@choerodon docker]# docker export 699851e1f58c >run.tar

导入容器

docker import nginx-test.tar nginx:imp 
或 
cat nginx-test.tar | docker import - nginx:imp

想要了解docker loaddocker import命令的区别,还必须知道docker savedocker export命令:

  • docker save images_name:将一个镜像导出为文件,再使用docker load命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比docker export命令导出的文件大,很好理解,因为会保存镜像的所有历史记录。
  • docker export container_id:将一个容器导出为文件,再使用docker import命令将容器导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。

docker save是用来将一个或多个image打包保存的工具。

docker save -o images.tar postgres:9.6 mongo:3.4

虽然命令行参数要求指定image,实际上也可以对container进行打包,docker save如果指定的是container,docker save将保存的是容器背后的image。

将打包后的镜像载入进来使用docker load,例如:

docker load -i images.tar

上述命令将会把postgres:9.6mongo:3.4载入进来,如果本地镜像库已经存在这两个镜像,将会被覆盖。

docker save的应用场景是,如果你的应用是使用docker-compose.yml编排的多个镜像组合,但你要部署的客户服务器并不能连外网。这时,你可以使用docker save将用到的镜像打个包,然后拷贝到客户服务器上使用docker load载入。

1,文件大小不同
export 导出的镜像文件体积小于 save 保存的镜像

2,是否可以对镜像重命名
docker import 可以为镜像指定新名称
docker load 不能对载入的镜像重命名

3,是否可以同时将多个镜像打包到一个文件中
docker export 不支持
docker save 支持

4,是否包含镜像历史
export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

5,应用场景不同
docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

注意:导入的容器需要重新指定工作目录和开放的端口以及启动命令

[root@choerodon data]# docker run -d -p 3000:3000 --name postwomen -w /app liyasthomas/postwoman:latest docker-entrypoint.sh npm run start
e09d73b29098a76aaa0d89d4367e1b020f7083041a57d13b394b53db57ef75a4

如何指定容器的工作目录?

答: 启动容器时传入-w <work_dir>参数即可,如:

  docker run -it -w <work_dir> <container_image_name> <command>

  示例:

  docker run -it -w /home/jello centos /bin/bash

3.仓库

公有仓库(阿里云)

1. 登录阿里云Docker Registry

$ sudo docker login --username=zhxpgc registry.cn-hangzhou.aliyuncs.com

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

您可以在访问凭证页面修改凭证密码。

2. 从Registry中拉取镜像

$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/pigic/hzero-customs:[镜像版本号]

3. 将镜像推送到Registry

$ sudo docker login --username=zhxpgc registry.cn-hangzhou.aliyuncs.com$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/pigic/hzero-customs:[镜像版本号]$ sudo docker push registry.cn-hangzhou.aliyuncs.com/pigic/hzero-customs:[镜像版本号]

请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

4. 选择合适的镜像仓库地址

从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。

如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录,并作为镜像命名空间前缀。

5. 示例

使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。

$ sudo docker imagesREPOSITORY                                                         TAG                 IMAGE ID            CREATED             VIRTUAL SIZEregistry.aliyuncs.com/acs/agent                                    0.7-dfb6816         37bb9c63c8b2        7 days ago          37.89 MB$ sudo docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816

使用"docker images"命令找到镜像,将该镜像名称中的域名部分变更为Registry专有网络地址。

$ sudo docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816

私有仓库Harbor

参考下面链接搭建

https://www.cnblogs.com/panwenbin-logs/p/10218099.html

4.数据管理

1.创建数据卷容器

docker run -d -p --name web -v /webapp traning/webapp

2.挂载主机目录作为数据卷

docker run -d -p --name web -v /src/webapp:/opt/webapp training/webapp

3.记录服务器输入过的命令历史

# 查看/root/.bash_history

4.挂载一个本地文件作为数据卷

[root@choerodon docker]# docker run --rm -it -v ~/.bash_history:/data/docker/.bash_history ubuntu /bin/bash
root@b5f442dd0f87:/# ls   
bin  boot  data  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@b5f442dd0f87:/# cd /data/docker/

ℹ如果直接挂载一个文件到容器,使用文件编辑工具,包括vi或者sed-in-place的时候,可能会造成文件inode的改变,从Docker 1.1.0起,这会导致报错信息。

5.数据卷容器

[root@choerodon docker]# docker run -it -v /dbdata --name db-data ubuntu
root@53afbf18eede:/# ls
bin  boot  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

其他容器共同用,通过–volumes-from

db1容器使用,并且创建文件a.txt

[root@choerodon docker]# docker run -it --volumes-from db-data --name db1 ubuntu
root@aba636719295:/# ls
bin  boot  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@aba636719295:/# cd /dbdata/
root@aba636719295:/dbdata# ls
root@aba636719295:/dbdata# vi aa.txt
bash: vi: command not found
root@aba636719295:/dbdata# echo hello>a.txt
root@aba636719295:/dbdata# ls
a.txt
root@aba636719295:/dbdata# cat a.txt
hello
root@aba636719295:/dbdata# cd ..
root@aba636719295:/# exit
exit

db2容器使用,查看a.txt

[root@choerodon docker]# docker run -it --volumes-from db-data --name db2 ubuntu
root@b083e5f24e5c:/# ls
bin  boot  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@b083e5f24e5c:/# cd dbdata/
root@b083e5f24e5c:/dbdata# ls
a.txt
root@b083e5f24e5c:/dbdata# cat a.txt
hello

注意:使用–volumes-from参数所挂载的容器自身并不需要保持在运行状态。如果删除了挂载的容器,(包括db-data、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。

6.利用数据卷容器迁移数据

备份

[root@choerodon docker]# docker run --volumes-from db-data -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
tar: Removing leading `/' from member names
/dbdata/
/dbdata/a.txt

恢复

docker run --volumes-from db-data -v $(pwd):/backup ubuntu tar xcf /backup/backup.tar

7.查看docker消耗空间

总的镜像消耗磁盘空间

[root@choerodon docker]# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              7                   3                   3.156GB             1.166GB (36%)
Containers          6                   6                   36.96kB             0B (0%)
Local Volumes       34                  1                   452.2MB             410.4MB (90%)
Build Cache         0                   0                   0B                  0B

每个镜像的消耗磁盘空间

[root@choerodon docker]# docker system df -v
Images space usage:

REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE                SHARED SIZE         UNIQUE SIZE         CONTAINERS
ubuntu                                                  latest              72300a873c2c        2 weeks ago         64.21MB             0B                  64.21MB             0
liyasthomas/postwoman                                   latest              8fde9049303e        2 weeks ago         939.9MB             0B                  939.9MB             1
pigic/hzero-customs                                     1.1.0               c3a7900b623c        4 weeks ago         872.5MB             643.2MB             229.3MB             0
registry.cn-hangzhou.aliyuncs.com/pigic/hzero-customs   1.1.0               09cf05df3868        4 weeks ago         872.4MB             643.2MB             229.2MB             0
mysql                                                   5.7                 c4f186b9e038        5 weeks ago         434.9MB             0B                  434.9MB             4
actiontech/dble                                         latest              206551d47f30        3 months ago        615MB               0B                  615MB               1
java                                                    8                   d23bdf5b1b1b        3 years ago         643.2MB             643.2MB             0B                  0

Containers space usage:

CONTAINER ID        IMAGE                          COMMAND                  LOCAL VOLUMES       SIZE                CREATED             STATUS              NAMES
08f0a2ec9505        liyasthomas/postwoman:latest   "docker-entrypoint.s…"   0                   55B                 2 weeks ago         Up 2 weeks          affectionate_pare
699851e1f58c        mysql:5.7                      "docker-entrypoint.s…"   0                   4B                  3 weeks ago         Up 3 weeks          mysqlpart2
ef7a7997a953        mysql:5.7                      "docker-entrypoint.s…"   0                   4B                  3 weeks ago         Up 3 weeks          mysqlpart1
33daa35ccbbd        actiontech/dble:latest         "/opt/dble/bin/docke…"   1                   34.9kB              3 weeks ago         Up 3 weeks          dble-server
0ef06cb1f12a        mysql:5.7                      "docker-entrypoint.s…"   0                   881B                4 weeks ago         Up 4 weeks          mysqlslave
4c9ba0f2e4fc        mysql:5.7                      "docker-entrypoint.s…"   0                   1.11kB              4 weeks ago         Up 4 weeks          mysqlmaster

Local Volumes space usage:

VOLUME NAME                                                        LINKS               SIZE
e1c2d71fb02be72dbf7571da83eb048590c0a6986fc0f7300214e8e5743fa688   0                   0B
fdc555d800077194978b255ff49118e9a11ea08ac1fbc5ce85221a72364ecad0   0                   0B
8262471423ad3bc9d47ceb974344e6f1128eff5e28d8f03fde55c8c9a2e401c1   0                   0B
b504e94e06e98cea5896e3ac5d3f4705e21b0fea23ebe857059e57c8f7c7b0d1   0                   0B
3dcab99dff78a36c2a210efb0311887eccc7c71dc7d1d72ab749d86f3fffd64c   0                   92B
a62f5431be564477751c00aad87abef649a5136e6e3dbe49feb7e55465fced6b   0                   0B
e5505bfcf2dda897827fff105bf7b91a5de7cb8c2278fde8d2cd98813c8c6628   0                   0B
2a9612067abd36a7c72a78f9df4aaf4687045d693f61d5827f9c95a410efb501   0                   41.03MB
799a8e8bb756085503481d57839e7bbc74a2a17c23bef5e8021937fd8433ff79   0                   41.05MB
14d1f23d4d742324e61c9d18279dc1645403672d6bb32737556f3cb645b6aff0   0                   92B
0c1459970579ffbef45fa1067944b06eb851061ed0bf3858ba2803e5dcff4c39   0                   0B
9de30d68162e244d1c882746adb220843a81d2ea8744f87dab8704438ab12c4d   0                   0B
c0b46f251fb577afbb93fec485c05e5c78893108f48faaf26d0d5350428cfdbc   0                   41.05MB
3709f7a49751d092a8cc36a4ccc8e09b9da6e7ed0b3e97213293edced6007ad9   0                   41.03MB
ba3feebbabdae5245cd6cd81dcc24db6d37547530f3ba331cdb458d9743f1cd5   0                   0B
0cc2d131285c1e6c2ea6a739ed52245879e820e140f698c3f640e988819e8dfe   0                   0B
86d4a1ba8ad506c9a52ca6b6643cb48016162c429bb4c558b60bfa371c92c9a3   0                   41.03MB
e4a4c73bb968b17c78fc51e7ccf470e110c80b8d2c4c99f6a91b040fd760ca09   0                   0B
c3dbcf8a2640d5bf819ae34d1a35fa5ef1840203146ee4d674940cf4869b8ac9   0                   0B
ccff993e1a65d05f8c3b6a36987bf064a49871f6cafe9669091dcc640a43560f   0                   6B
1cbc6c5c5a55e536f307748bd72712f0120042ba2649908afdc37e01675e167b   0                   0B
84a2a8b9c1486583f9c02969c695fbe5b9ce1d162549bcf2c44ca8d8a4fb0f81   0                   41.05MB
a034ed3e94417858935ac4b3297b015513801398487f6056ba28af9fae98a932   0                   41.05MB
7d47a5b1887ade440ed8193abe8730c9a84436cd472c47738c0980ea82631421   0                   41.03MB
7e6827a22f37f3fb7cb17300eb447c0479c237440a96487744fde1fee61dd3e7   0                   41.03MB
eacc89dc148b55afe9277a37d66fedd73579f5deb7da0e77673a2ecbd82e20f2   0                   41.04MB
59074a354ddfe8aa249ee8d8a201bdfdd706a45339db9f69ea7970232356aec8   1                   41.76MB
cd71fe3606f346fd8e91d962ff8aea5d0a02c093e6bb5af708215a1c9ed6b300   0                   0B
31316df6ebd501c08b65196b91d4d6089d5e8ea934c585c9231ab676b3d1fc17   0                   0B
c089bb311ad0e0547e930d0dbd01194285823e05efb99fc790e2b3025dbc70c7   0                   0B
583fd90cf62e95a0a3eece6deb22d3bee37be100daabbbc7a3b1820498c205a4   0                   0B
1bcb9ff31f91aea611ee3a273c40e2c3332afc667543e202a5f553f80a391279   0                   0B
3d05480c368a6633463bd324c8e3c90f6650e3971c47ef6c7d0ca0cfa80ba27a   0                   0B
95ff7d6c6df5ad73f9829ee5a00c71c60a3a8ee4085781635ccd5a14531913d0   0                   92B

Build cache usage: 0B

CACHE ID            CACHE TYPE          SIZE                CREATED             LAST USED           USAGE               SHARED

查看消耗内存

[root@choerodon docker]# ps -ef|grep 4c9ba0f2e4fc(容器id)
root     30445  7362  0 08:21 pts/1    00:00:00 grep --color=auto 4c9ba0f2e4fc
root     31536   674  0 2月09 ?       00:01:47 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/4c9ba0f2e4fcf8c9781d852dd3b69f607c89a5e75249b86f772cc693bb1dc05a -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc -systemd-cgroup
[root@choerodon docker]# top -p 31536

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND               31536 root      20   0  109092   4124   3096 S   0.0  0.0   1:47.37 containerd-shim 

**VIRT:virtual memory usage 虚拟内存
**1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

RES:resident memory usage 常驻内存
1、进程当前使用的内存大小,但不包括swap out
2、包含其他进程的共享
3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
4、关于库占用内存的情况,它只统计加载的库文件所占内存大小

SHR:shared memory 共享内存
1、除了自身进程的共享内存,也包括其他进程的共享内存
2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
3、计算某个进程所占的物理内存大小公式:RES – SHR
4、swap out后,它将会降下来

5.网络基础配置

1.可以通过-P或者-p参数来指定端口映射。

-P(大写的) Docker会随机映射一个49000~49900的端口至容器内部开放的网络端口。

-p(小写的) 则可以指定要映射的端口,并且在一个指定端口上只可以绑定一个容器。

[root@choerodon docker]# docker run -d -P training/webapp python app.py
Unable to find image 'training/webapp:latest' locally
latest: Pulling from training/webapp
Image docker.io/training/webapp:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
e190868d63f8: Pull complete 
909cd34c6fd7: Pull complete 
0b9bfabab7c1: Pull complete 
a3ed95caeb02: Pull complete 
10bbbc0fc0ff: Pull complete 
fca59b508e9f: Pull complete 
e7ae2541b15b: Pull complete 
9dd97ef58ce9: Pull complete 
a4c1b0cb7af7: Pull complete 
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image for training/webapp:latest
c7d2c28a96b9243ed2de80fba2d414e6aa6d7152750abcb75b2c080c84084afd
[root@choerodon docker]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                                              NAMES
c7d2c28a96b9        training/webapp                "python app.py"          11 minutes ago      Up 11 minutes       0.0.0.0:32768->5000/tcp                            flamboyant_proskuriakova

可以通过docker logs 命令查看应用的信息

[root@choerodon docker]# docker logs flamboyant_proskuriakova
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

2.映射到指定地址的任意端口

docker run -d -p 127.0.0.1::5000 traning/webapp python app.py
[root@choerodon docker]# docker run -d -p 127.0.0.1::5000 training/webapp python app.py
03031bd536cd1b5aae4c8dc80f73a9dcadc81bf5e8f3e67a25d04c6931cc00c6
[root@choerodon docker]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                                              NAMES
03031bd536cd        training/webapp                "python app.py"          6 seconds ago       Up 5 seconds        127.0.0.1:32768->5000/tcp                          nifty_bohr

查看容器端口配置

docker port nifty_bohr 5000
[root@choerodon docker]# docker port nifty_bohr 5000
127.0.0.1:32768

3.容器互联实现容器间通信–link

查看容器的名字

[root@choerodon ~]# docker inspect -f {{.Name}} 08f0a2ec9505
/affectionate_pare

使用–link实现容器间互联

[root@choerodon ~]# docker run -d --name db training/postgres
[root@choerodon ~]# docker run -d -P --name web --link db:db training/webapp python app.py
f8c4888314899027245ab56e3629e8d4bb6e61e29cc324921bc1ba027700ff2e
[root@choerodon ~]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                                              NAMES
f8c488831489        training/webapp                "python app.py"          33 seconds ago      Up 32 seconds       0.0.0.0:32770->5000/tcp                            web
fbdeb9c80b9a        training/postgres              "su postgres -c '/us…"   10 minutes ago      Up 10 minutes       5432/tcp                                           db

Docker在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上。在启动db容器的时候并没有使用-p或者-P标记,从而避免了暴露数据库端口到外部网络上。

Docker通过两种方式为容器公开连接信息:

①环境变量。

②更新/etc/hosts文件

使用env命令可以查看web容器的环境变量

root@748cb6658940:/opt/webapp# env
HOSTNAME=748cb6658940
DB_NAME=/web/db
TERM=xterm
DB_PORT_5432_TCP_ADDR=172.17.0.7
DB_PORT=tcp://172.17.0.7:5432
DB_PORT_5432_TCP=tcp://172.17.0.7:5432
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/opt/webapp
DB_PORT_5432_TCP_PORT=5432
SHLVL=1
HOME=/root
DB_PORT_5432_TCP_PROTO=tcp
LESSOPEN=| /usr/bin/lesspipe %s
DB_ENV_PG_VERSION=9.3
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/env

其中DB_开头的环境变量是提供web容器连接db容器使用,前缀采用大写的连接别名。

除了环境变量,Docker还添加了host信息到父容器的/etc/hosts的文件

root@748cb6658940:/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.7      db fbdeb9c80b9a
172.17.0.8      748cb6658940

用ping来测试db容器,它会解析成172.17.0.5。

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

6.使用Dockerfile创建镜像

指令:

1.from

格式: FROM:

第一条命令必须是from命令。并且在同一个Dockerfile中创建多个镜像时,可以使用多个from指令(每个镜像一次)

2.MAINTAINER

指定维护者信息

3.RUN

格式为:RUN 或RUN[“executable”,“param1”,“param2”]

前者将在shell终端中运行命令,即/bin/sh -c; 后者则使用exec执行。指定使用其他终端可以通过第二种方法实现,例如RUN["/bin/bash","-c",“echo hello”]

每条run指令将在当前镜像基础上执行指定指令,并提交为新的镜像。当命令较长时可以用\来换行。

4.CMD

容器启动以后,默认的执行的命令。重点就是这个“默认”。意味着,如果docker run没有指定任何的执行命令或者dockerfile里面也没有entrypoint,那么,就会使用cmd指定的默认的执行命令执行。同时也从侧面说明了entrypoint的含义,它才是真正的容器启动以后要执行命令。
参考:https://blog.csdn.net/u010900754/article/details/78526443

支持三种格式:

CMD[“executable”,“param1”,“param2”]使用exec执行,推荐方式。

CMD command param1 param2在/bin/sh中执行,提供给需要交互的应用。

CMD [“param1”,“param2” ] 提供给ENTRYPOINT的默认参数。

FROM centos
 
CMD ["p in cmd"]
ENTRYPOINT ["echo"]

注意:

1.Dockerfile中只能有一条CMD指令。如果存在多个CMD,那么只有最后一个CMD才会生效。

2.CMD的主要目的是为正在执行的容器提供默认值。这些默认值可以包括可执行文件,也可以省略可执行文件。省略可执行文件时必须指定ENTRYPOINT指令。

3.如果CMD用于为ENTRYPOINT指令提供默认参数,则CMD和ENTRYPOINT指令都应该使用JSON数组格式指定。

4.exec形式会被解析为JSON数组,这意味着必须对单词使用双引号,而不是单引号。

5.与shell形式不同,exec形式不调用命令shell。这意味着正常的shell处理不会生效。例如,CMD [“echo”, " H O M E " ] 不 会 对 HOME"]不会对 HOME"]HOME执行变量替换。如果想要shell处理生效,要么使用shell形式,要么直接执行shell,例如:CMD [ “sh”, “-c”, “echo $HOME” ]。当使用exec形式并直接执行shell时,就像shell形式一样,执行环境变量扩展的是shell,而不是docker。

CMD与ENTRYPOINT指令的比较参考链接:

https://www.cnblogs.com/lienhua34/p/5170335.html

5.EXPOSE

格式为: Expose […]

例如: Expose 22 80 8443

告诉Docker服务器容器暴露的端口号,供互联系统使用。在启动容器时通过-P,Docker会自动分配一个端口转发到指定端口;使用-p,则可以具体指定哪个本地端口映射过来。

6.ENV

格式为 ENV

指定一个环境变量,会被后续RUN治指令使用,并在容器运行时保持。例如:

ENV PG_MAJOR 9.3

ENV PG_VERSION 9.3.4

RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz|tar -xJC /user/src/postgress &&…

ENV PATH /user/local/postgres-$PG_MAJOR/bin:$PATH

7.ADD

格式为ADD

将复制指定的src到容器的dest。其中src可以是Dockerfile所在目录的一个相对路径(文件或目录);也可以是一个URL;还可以是一个tar文件(自动解压为目录)。

8.COPY

格式为COPY

复制本地主机的(为Dockerfile所在目录的相对路径,文件或目录)为容器中的。目标路径不存在时,会自动创建。

当使用本地目录为源目录时,推荐使用COPY

源路径可以有多个
源路径是相对于执行build的相对路径
源路径如果是本地路径,必须是build上下文中的路径
源路径如果是一个目录,则该目录下的所有内容都将被加入到容器,但是该目录本身不会
目标路径必须是绝对路径,或相对于WORKDIR的相对路径
目标路径如果不存在,则会创建相应的完整路径
目标路径如果不是一个文件,则必须使用/结束
路径中可以使用通配符

#把当前config目录下所有文件拷贝到/config/目录下
ADD config/ /config/
1、如果源路径是个文件,且目标路径是以 / 结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。
如果目标路径不存在,则会自动创建目标路径。

2、如果源路径是个文件,且目标路径是不是以 / 结尾,则docker会把目标路径当作一个文件。
如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;
如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。
如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。 注意,这种情况下,最好显示的以 / 结尾,以避免混淆。

3、如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。
如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下。

4、如果源文件是个归档文件(压缩文件),则docker会自动帮解压。



在Docker 1.0发布时候,包括了新指令COPY。不像是ADD,COPY 更加直接了当,只复制文件或者目录到容器里。
COPY不支持URL,也不会特别对待压缩文件。如果build 上下文件中没有指定解压的话,那么就不会自动解压,只会复制压缩文件到容器中。
COPY是ADD的一种简化版本,目的在于满足大多数人“复制文件到容器”的需求。
Docker 团队的建议是在大多数情况下使用COPY。拷贝文件的原则:使用COPY(除非你明确你需要ADD)

参考:https://www.cnblogs.com/zdz8207/p/linux-docker-add-copy.html

9.ENTRYPOINT

配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。

每个dockerfile只能有一个entrypoint,当指定多个entrypoint时,只有最后一个生效。

原因是镜像的entrypoint设置的启动脚本格式是dos,在linux系统上用vi修改成unix格式即可
# vi filename
# :set ff  回车后看到当前文件的fileformat格式
# :set ff=unix 回车后输入:wq保存文件,重新build镜像即可。

10.volumn

创建一个可以从本地主机或其他容器挂载的挂载点。

之前我们说过,容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中,后面的章节我们会进一步介绍 Docker 卷的概念。

为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。

VOLUME /data
这里的 /data 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。当然,运行时可以覆盖这个挂载设置。比如:

docker run -d -v mydata:/data xxxx
在这行命令中,就使用了 mydata 这个命名卷挂载到了 /data 这个位置,替代了 Dockerfile 中定义的匿名卷的挂载配置。

使用 dokcer inspect mycontainer 可以查看到具体的挂载情况:

Docker技术研究_第1张图片

如上图所示,容器中的"/home/xiaoban/logs/eureka-server/log" 被自动匿名挂载到了本地机器上的 /var/lib/docker/volumes/***

11.USER

指定运行用户

12.WORKDIR

为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。

可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

最终路径为/a/b/c

7.创建镜像

可以通过docker build命令来创建镜像。

要指定镜像的标签信息,可以通过-t选项。

8.创建支持SSH服务的镜像

命令创建

1.下载ubuntu

docker run -it ubuntu:14.04 /bin/bash

2.更新软件源

apt-get update

3.下载安装SSH服务

yum -y install openssh-server

4.要正常启动SSH服务,需要目录/var/run/sshd存在,手动创建它,并启动服务:

mkdir -p /var/run/sshd

5.启动ssh服务

root@7d04af74cda9:/# /usr/sbin/sshd -D &
[1] 607

此时查看容器的22端口(SSH服务默认监听的端口),已经处于监听状态:

root@7d04af74cda9:/# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      607/sshd        
tcp6       0      0 :::22                   :::*                    LISTEN      607/sshd 

修改SSH服务的安装登录配置,取消pam登录限制:

sed -ri 's/session    required    pam_loginuid.so/#session    required    pam_loginuid.so/g' /etc/pam.d/sshd

宿主机创建公钥

ssh-keygen -t rsa
root@7d04af74cda9:/# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDoUcVrXKVF+8cx2p42geBrWd24/9ugYnKXXt/80WqOF0kNt4wttEq5zBfQDw4tdJaZvmEwxPYEmtQAk76KyJtdnemZc9JOSAHrDE1ld399lBgs7cjwOufiNHQnFu0esLdZnzgNV3nEPNje8NnCiqz7DBFw1l1L80bqPAKJb0WLnYuxRKmDtbPXDd4rCXaJm+yqJOqj7Iy4qsEFvvjpldMFcrJzCX6TsSGoljiDK+7P8zOkJN3ZPvoskX3TPsBuEGzw2TPvHr2Nkp+siLJoMM6kOBElVLJiPtlIRZp2Qjml8d8OkYAD5uoU9o3xl4+cicUZ0zt3Sv3wNW9yPIRH9WZ root@7d04af74cda9

放在容器内

root@7d04af74cda9:/# vi /root/.ssh/authorized_keys
root@7d04af74cda9:/# cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8jmjfjcX5lcIEpkoM2Ywd6FeGZDHozt8sSwb8slGA0mbxuQoIwHOCgg9JG0Eyg47A1VCFO3Xh4nqWDk1HyGbztY4gEoMBVpuVvK8/QMixiaNslnB2GPPA/EQc2JMqvnHc+E+9QNou4dBsXFhXd6q3XJ7CHiAvrWspKV0Pj42mW9Gejd9BwwTndCkRy6F8gqLmG8ug1T2M2P8KcypubKipBKdceqQwEyzh6jF2sqm0+DXPKOrMWtZ2qepl/AYDjhM7XtRBAwm7Ic3rgoMP3AnNQ7eLuhuew30NMK/lO0BuUdVX0ZcdxHs6kfEexHzOYaO94gulr9cQ9re982K+cyAv [email protected]

根目录新建run.sh,内容

#!/bin/bash
/usr/sbin/sshd -D
chmod 777 run.sh

保存镜像(7d04af74cda9为容器名)

$ docker commit 7d04af74cda9 sshd:ubuntu

使用镜像

[root@choerodon ~]# docker run -p 10022:22 -d sshd:ubuntu /run.sh
b4a06adb0b7f214bc456324108bc403ff7c2405812034c4c4bda3e85f98ee262
[root@choerodon ~]# docker ps -a
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                     PORTS                                              NAMES
b4a06adb0b7f        sshd:ubuntu                    "/run.sh"                23 seconds ago      Up 22 seconds              0.0.0.0:10022->22/tcp                              upbeat_taussig

访问SSH服务

[root@choerodon ~]# ssh 172.28.8.103 -p 10022
The authenticity of host '[172.28.8.103]:10022 ([172.28.8.103]:10022)' can't be established.
ECDSA key fingerprint is SHA256:afOvq+zCGaYPTMk7B7+0CHk8oritj/S4knsJ4i3oKMI.
ECDSA key fingerprint is MD5:62:56:dd:af:5c:b4:81:5f:e4:b4:52:2e:a0:65:d3:a7.
Are you sure you want to continue connecting (yes/no)? yes

下载宿主机私钥到本地

Docker技术研究_第2张图片

配置私钥路径

Docker技术研究_第3张图片

成功登录上容器

Docker技术研究_第4张图片

Dockerfile创建

创建目录

/data/docker/sshd_ubuntu

编写相关文件

Docker技术研究_第5张图片

cat ~/.ssh/id_rsa.pub >authorized_keys

run.sh

#!/bin/bash
/usr/sbin/sshd -D

Dockerfile

FROM ubuntu:14.04
MAINTAINER from www.pigic.com by pigic
RUN echo "开始搭建.."
RUN apt-get update
# 安装ssh服务
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
# 取消pam限制
RUN sed -ri 's/session    required    pam_loginuid.so/#session    required    pam_loginuid.so/g' /etc/pam.d/sshd
# 复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 777 /run.sh
# 开放端口
EXPOSE 22
RUN echo "搭建完成.."
# 设置自启动命令
ENTRYPOINT ["/run.sh"]

创建镜像

docker build -t sshd:dockerfile .

查看镜像

[root@choerodon sshd_ubuntu]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
sshd                                                    dockerfile          64b0599457c6        23 seconds ago      249MB
sshd                                                    ubuntu              6b8bd28e7fe2        36 hours ago        249MB
ubuntu                                                  latest              72300a873c2c        4 weeks ago         64.2MB
liyasthomas/postwoman                                   latest              8fde9049303e        4 weeks ago         940MB
pigic/hzero-customs                                     1.1.0               c3a7900b623c        6 weeks ago         872MB
pigic/hzero-customs                                     latest              c3a7900b623c        6 weeks ago         872MB
registry.cn-hangzhou.aliyuncs.com/pigic/hzero-customs   1.1.0               09cf05df3868        6 weeks ago         872MB
mysql                                                   5.7                 c4f186b9e038        7 weeks ago         435MB
ubuntu                                                  14.04               6e4f1fe62ff1        3 months ago        197MB
actiontech/dble                                         latest              206551d47f30        3 months ago        615MB
java                                                    8                   d23bdf5b1b1b        3 years ago         643MB
[root@choerodon sshd_ubuntu]# docker run -d -P sshd:dockerfile
78e2e1aadac3c2aca1d26c773db76182d7c6cf6231e9f751d956c59941891602
[root@choerodon sshd_ubuntu]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                                              NAMES
78e2e1aadac3        sshd:dockerfile                "/run.sh"                4 seconds ago       Up 3 seconds        0.0.0.0:32773->22/tcp                              silly_hawking

注意:

Dockerfile创建的镜像拥有继承性

Dockerfile 从From继承的对象,会把父的端口也暴露出来。

配置centos支持SSH访问

https://www.cnblogs.com/caidingyu/p/10642158.html

docker run -it --name centos7ssh centos:7.4.1708 /bin/bash
yum -y install passwd openssl openssh-server openssh-clients
# 创建 /var/run/sshd/目录,要不然sshd服务启动会报错
mkdir /var/run/sshd/
# 编辑sshd的配置文件/etc/ssh/sshd_config,将其中的UsePAM yes改为UsePAM no
sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config
# 7.创建公私密钥,输入命令后,直接按两次enter键确认就行了
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
#8.完成上述几步后,可以开启ssh服务了(&表示后台启动)
/usr/sbin/sshd -D &
# 9.此时使用命令ps -ef | grep sshd  便可以看到效果
#10.查询22端口是否处于监听状态
yum -y install lsof
lsof -i:22
# 11.修改root密码
passwd
#12.测试
#输入命令ssh localhost,然后输入之前设置的root密码

#13.如何配置外部客户端访问docker里的centos7.4容器
docker ps -a
#提交容器成为新的镜像,例如叫做sshd_centos7.4,输入
docker commit 容器ID sshd_dble
#启动这个镜像的容器,并映射本地的一个闲置的端口(例如15000)到容器的22端口,并启动容器的sshd(只要端口不冲突可以同时启动多个容器,如下图)
docker run -d -p 15000:22 sshd_dble /usr/sbin/sshd -D
#现在打开新的终端,输入ssh root@宿主机IP地址 -p 15000,如果能连接成功,会要求输入密码的,输入刚才passwd命令设置的root账户密码就可以进入容器的终端了

#如果连接失败,请检查防火墙是否未开放该端口。 

9.安装nginx

FROM sshd:dockerfile
MAINTAINER pigic from hand-china.com([email protected])

RUN apt update
RUN apt install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx

VOLUME ["/data","/etc/nginx/site-enabled","/var/log/nginx"]
WORKDIR /etc/nginx

ADD run.sh /run.sh
RUN chmod 777 /*.sh

EXPOSE 80
EXPOSE 443

ENTRYPOINT ["/run.sh"]

定义run.sh

#!/bin/bash
/usr/sbin/sshd &
/usr/sbin/nginx

创建镜像

docker build -t nginx:stable .
[root@choerodon nginx]# docker ps
CONTAINER ID        IMAGE                                                                 COMMAND                  CREATED             STATUS              PORTS                                                                  NAMES
36f715db3e09        nginx:stable                                                          "/run.sh"                5 seconds ago       Up 4 seconds        0.0.0.0:32776->22/tcp, 0.0.0.0:32775->80/tcp, 0.0.0.0:32774->443/tcp   strange_feistel

Docker技术研究_第6张图片
nginx内核优化参数(vim /etc/sysctl.conf,写入以下代码, 执行sysctl -p生效)

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter =1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000           #timewait的数量
net.ipv4.tcp_sack = 1                                 #有选择的应答
net.ipv4.tcp_window_scaling = 1                 #设置tcp/ip会话滑动窗口是否可变,1可变,0不可变。开启使滑动窗口大小增加数个数量级,提高数据传输能力
net.ipv4.tcp_rmem = 4096        87380    4194304  #tcp接收缓冲区
net.ipv4.tcp_wmem = 4096        16384    4194304  #tcp发送缓冲区
net.core.wmem_default = 8388608                        #发送套接字缓冲区大小的缺省值(字节单位)
net.core.rmem_default = 8388608                         #接收套接字缓冲区大小的缺省值
net.core.rmem_max = 16777216                           #接收套接字缓冲区大小的最大值
net.core.wmem_max = 16777216                          #发送套接字缓冲区大小的最大值
net.core.netdev_max_backlog = 262144           #允许送到队列的数据包最大数目
net.core.somaxconn = 262144                        #web应用中listen函数的backlog(积压)
net.ipv4.tcp_max_orphans = 3276800              #最多有多少个TCP套接字不被关联到任何一个用户的句柄上
net.ipv4.tcp_max_syn_backlog = 262144          #记录那些尚未收到客户端确认信息的连接请求最大值,表示SYN队列的长度,可以容纳更多等待连接的网络连接数
net.ipv4.tcp_timestamps = 0                  #时间戳关闭
net.ipv4.tcp_synack_retries = 1               #这个设置决定了内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_syn_retries = 1                    #内核放弃连接之前发送SYN包的数量
net.ipv4.tcp_tw_recycle = 1                     #timewait快速回收
net.ipv4.tcp_tw_reuse = 1                       #timewait 用于新的连接
net.ipv4.tcp_mem =    1835008 2752512 3670016     #out of socket memory
net.ipv4.tcp_fin_timeout = 15                     #保持在FIN-WAIT-2状态的时间,对端出错永不关闭甚至当机缺省值是60s
net.ipv4.tcp_keepalive_time = 30                                #keepalived 发送消息的频度
net.ipv4.ip_local_port_range = 1024    65000              #端口范围

10.安装Tengine

# 设置继承自创建的 sshd 镜像
FROM sshd:dockerfile

# 作者信息
MAINTAINER waitfish from dockerpool.com([email protected])

# Let the conatiner know that there is no tty

# 安装编译环境
RUN apt-get update
RUN  apt-get install -y build-essential debhelper make autoconf automake patch

RUN apt-get install -y dpkg-dev fakeroot pbuilder gnupg dh-make libssl-dev libpcre3-dev git-core

RUN echo "Asia/Shangshi" > /etc/timezone && \
                dpkg-reconfigure -f noninteractive tzdata

# 创建 Nginx 用户
RUN adduser --disabled-login --gecos 'Tengine' nginx

# tengine 安装的 shell 脚本
WORKDIR /home/nginx
RUN su nginx -c 'git clone https://github.com/alibaba/tengine.git'
WORKDIR /home/nginx/tengine
RUN su nginx -c 'mv packages/debian .'

ENV DEB_BUILD_OPTIONS nocheck

RUN su nginx -c 'dpkg-buildpackage -rfakeroot -uc -b'

WORKDIR /home/nginx
RUN dpkg -i tengine_2*_amd64.deb 

# 定义挂载的目录
VOLUME ["/data", "/etc/nginx/sites-enabled", "/var/log/nginx"]

# 让 Nginx 运行在排 Daemon 模式
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# 定义工作目录
WORKDIR /etc/nginx

# 添加我们的脚本,并设置权限,这会覆盖之前放在这个位置的脚本
ADD run.sh /run.sh
RUN chmod 755 /*.sh

# 定义输出命令
CMD ["/run.sh"]

# 定义输出端口
EXPOSE 80
EXPOSE 443

定义sh文件

#!/bin/bash
/usr/sbin/sshd &
/usr/sbin/nginx

编译镜像

docker build -t nginx:tengine .

手写dockerfile

# 设置继承自创建的 sshd 镜像
FROM sshd:dockerfile

# 作者信息
MAINTAINER waitfish from dockerpool.com([email protected])

RUN groupadd -r nginx
RUN useradd -r -g nginx -M nginx

ADD tengine-2.3.2.tar.gz /tengine/

你可能感兴趣的:(HZERO,linux)