docker学习笔记

72 阅读5分钟

本文以参与[新人创作礼]活动,一起开启掘进创作之路。

一.Docker安装

 

4b40c021bd44b2044d0884185932d4ee_0912e9a3d3c24ce3abb55ef65e169808.jpeg 目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在 CentOS-7 上,要求系统为64位、系统内核版本为 3.10 以上。Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。

所以我们需要查看自己的Centos内核是否支持Docker,使用下面的命令,可根据上面对照看自己的Centos是否符合要求,如不符合请升级。

#查看系统内核

[ironmanjay@localhost ~]$ uname -a

1. 更新下载源

先备份

sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

更换源

sudo wget -O /etc/yum.repos.d/CentOS-Base.repo mirrors.aliyun.com/repo/Centos…

2. 更新 yum

sudo yum update

3. 安装相关软件包

sudo yum -y install gcc

sudo yum -y install gcc-c++

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

4. 更新 yum 软件包索引

sudo yum makecache fast

5. 安装 Dcoker

sudo yum -y install docker-ce

6. 启动 Dcoker 服务

systemctl start docker

7. 设置开机自启

sudo systemctl enable docker

8. Docker 加入到组中

sudo groupadd docker

sudo gpasswd -a [本地用户名] docker

9. 配置镜像加速

首先进入阿里云的容器镜像服务网站点击

account.aliyun.com/login/login…

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/42704343067448c4aab67c40156c7fd1~tplv-k3u1fbpfcp-zoom-1.image​编辑

    然后按照下面操作修改镜像加速

sudo mkdir -p /etc/docker

sudo vim /etc/docker/daemon.json

    在打开的文件中按照下面编辑

{

  "registry-mirrors": ["刚刚复制的加速器地址"]

}

    加载配置文件

sudo systemctl daemon-reload

    重启Docker服务

sudo systemctl restart docker

10. 测试

1. 查看版本

docker version

2. HelloWorld

docker pull hello-world

docker run hello-world

至此安装完毕!

二.Docker常用命令

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

如:docker stats --help

1. ****帮助命令

docker version                                 #查看版本号

docker info                                             #显示Docker系统信息,包括镜像和容器数

docker --help                                  #查看Docker有哪些命令

2. 镜像命令

docker images                                  #查看当前Docker中的镜像

docker images ls                                       #列出所有的镜像

docker search 某个镜像名字                        #查询某个镜像

docker pull 某个镜像名字                         #拉取(下载)某个镜像

docker rmi 某个镜像名字ID                               #删除某个镜像

3. 容器基本命令( 切记,有镜像才能创建容器)

docker run [OPTIONS] image [COMMAND] [ARG...]          #新建并启动容器

例子:docker run -it ubuntu /bin/bash      

        -i: 交互式操作。

        -t: 终端。

        ubuntu: ubuntu 镜像。

        /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

docker ps [OPTIONS]                                   #列出当前所有正在运行的容器

                                              –a 全部  -l 最近一个

exit                                          #容器停止退出

ctrl+P+Q                                              #容器不停止退出

docker start 容器ID或者容器名/或前四位容器ID      #启动容器

docker restart 容器ID或者容器名                 #重启容器

docker stop 容器ID或者容器名                    #停止容器

docker kill 容器ID或者容器名                    #强制停止容器

docker rm 容器ID                                      #删除已停止的容器

docker rm -f $(docker ps -a -q)                #一次性删除多个容器

docker ps -a -q | xargs docker rm                       #一次性删除多个容器

docker container prune                                #可以清理掉所有处于终止状态的容器。

5. 容器重要命令

docker run -d 容器名                            #启动守护式容器,就是后台运行

如:docker run -itd --name ubuntu-test ubuntu /bin/bash        #--name 给容器起个名字

docker logs -f -t --tail 容器ID                #查看容器日志,-t是加入时间戳,-f是最新的日志打印,--tail数字显示最后多少条

docker top 容器ID                              #查看容器内运行的进程

docker inspect 容器ID                          #查看容器内部细节

使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。

进入容器的方法

docker exec -it 容器ID /bin/bash                       #进入正在运行的容器并以命令行交互,使用exit退出后容器存活

docker exec -it  -u root容器ID /bin/bash          #以root用户登录容器

docker attach 容器ID                           #重新进入Docker容器,使用exit退出后容器停止

docker cp  容器ID:容器内路径 目的主机路径          #从容器内拷贝文件到主机上

docker cp 容器名:要拷贝的文件在容器里面的路径        要拷贝到宿主机的相应路径 

docker cp 要拷贝的文件路径    容器名:要拷贝到容器里面对应的路径

导入,导入容器

docker export 容器ID  > 文件名

例子:docker export 1e560fca3906 > tomcat.tar    #导出容器 1e560fca3906 快照到本地文件 tomcat.tar 

Docker import

可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 tomcat.tar 导入到镜像 test/tomcat:v1:

cat tomcat.tar | docker import - test/tomcat:v1

通过docker images 查看,后启动看一下

docker run -it --name tomcatv1 test/tomcat:v1 /bin/bash

通过export 和import备份恢复的容器 ,在原容器内存储的文件会保存在新建容器中

通过指定 URL 或者某个目录来导入,例如:

$ docker import example.com/exampleimag… example/imagerepo

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

运行一个 web 应用

我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。

runoob@runoob:~# docker pull training/webapp  # 载入镜像

runoob@runoob:~# docker run -d -P training/webapp python app.py

-d: 让容器在后台运行。

-P: 将容器内部使用的网络端口随机映射到我们使用的主机上。

32768 端口就是python app.py 打开的应用

[root@node1 ~]# netstat -anp | more

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   

tcp6       0      0 :::32768                :::*                    LISTEN      25914/docker-proxy

这里多了端口信息。

PORTS

0.0.0.0:32769->5000/tcp

Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。

查看 WEB 应用容器

使用 docker ps 来查看我们正在运行的容器:

runoob@runoob:~#  docker ps

CONTAINER ID        IMAGE               COMMAND             ...        PORTS                

d3d5e39ed9d3        training/webapp     "python app.py"     ...        0.0.0.0:32769->5000/tcp

测试

Linux系统shell测试方法:

curl http://0.0.0.0:32768

我们也可以通过 -p 参数来设置不一样的端口:

docker run -d -p 5001:5000 training/webapp python app.py

[root@node1 ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES

9050a369d711        training/webapp     "python app.py"     6 seconds ago       Up 5 seconds        0.0.0.0:5001->5000/tcp    sharp_benz

容器内部的 5000 端口映射到我们本地主机的 5001 端口上。

三.创建镜像

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

1、从已经创建的容器中更新镜像,并且提交这个镜像

2、使用 Dockerfile 指令来创建一个新的镜像

方法1:从容器中更新镜像

例子:

1.创建一个容器:docker run -t -i ubuntu:15.10 /bin/bash

root@e218edb10161:/#

2.在容器内安装软件,进行修改等操作

更新源参见附件1”容器apt-get=yum(linux)”软件换源

apt-get update

apt-get install vim

apt-get  install net-tools

。。。。。编辑后

  1. 通过容器创建镜像

docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2

各个参数说明:

-m: 提交的描述信息

-a: 指定镜像作者

e218edb10161 容器 ID

runoob/ubuntu:v2: 指定要创建的目标镜像名

4.查看

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

方法2:构建镜像

我们使用命令 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 命令来构建一个镜像。

runoob@runoob:~$ docker build -t runoob/centos:6.7 .

Sending build context to Docker daemon 17.92 kB

Step 1 : FROM centos:6.7

 ---> d95b5ca17cc3

Step 2 : MAINTAINER Fisher "fisher@sudops.com"

 ---> Using cache

 ---> 0c92299c6f03

Step 3 : RUN /bin/echo 'root:123456' |chpasswd

 ---> Using cache

 ---> 0397ce2fbd0a

Step 4 : RUN useradd runoob

参数说明:

  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec

runoob@runoob:~$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE

我们可以使用新的镜像来创建容器

runoob@runoob:~$ docker run -t -i runoob/centos:6.7  /bin/bash

[root@41c28d18b5fb /]# id runoob

uid=500(runoob) gid=500(runoob) groups=500(runoob)

四.数据卷

Docker提供了三种不同的方式将数据从宿主机挂载到容器中:

  1. volumes:(主机固定目录)

Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)目前所有Container的数据都保存在了这个目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名(就上面这一堆很长ID的名字)卷。

  1. bind mounts:(主机任意目录可用)

意为着可以存储在宿主机系统的任意位置;(比较常用的方式

但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了

  1. tmpfs:(内存中挂载)

挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式

 

4.1 volume的基本使用

1管理卷

docker volume create edc-nginx-vol // 创建一个自定义容器卷

docker volume ls // 查看所有容器卷

docker volume inspect edc-nginx-vol // 查看指定容器卷详情信息

查看:

Cd /var/lib/docker/volumes

[root@node1 volumes]# ls

db2volume1  metadata.db

2 卷的管理

docker run -it --name=liuyang-db2 -p 50001:50000 -v db2volume1:/store centos/db2:v10 /bin/bash

-v代表挂载数据卷  这里使用自定数据卷db2volume1并且将数据卷挂载到 容器内的/store目录

测试:

我们在容器内/store下创建目录backup和文件1.txt

我们在主机上/var/lib/docker/volumes/db2volume1/_data中看到创建的文件及目录。

如果我们手动stop并且remove当前nginx容器,我们会发现容器卷里面的文件还在,并没有被删除掉

我们还可以启动多个nginx容器实例,并且共享同一个数据卷,复用性和扩展性较强。

3清理卷

  如果不再使用自定义数据卷了,那么可以手动清理掉:

# docker stop liuyang-db2 // 暂停容器实例  liuyang-db2为容器名
# docker rm liuyang-db2 // 移除容器实例
# docker volume rm db2volume1 // 删除自定义数据卷

4.2 bin mounts的基本使用

[root@node1 /]# docker images
REPOSITORY         TAG                 IMAGE ID            CREATED             SIZE
centos/db2          v10                 e1c7bfb0367e        56 minutes ago      5.1GB

docker run -it -u root --name=liuyang-db2-v2 -v /home/containerv2/:/store centos/db2:v10

将宿主机上的/home/containerv2/目录(如果没有会自动创建)挂载到容器的 /store目录上

例子:
容器)
[db2inst1@7c5d4dfc0d43 /]$ cd /store
[db2inst1@7c5d4dfc0d43 store]$ ls
[db2inst1@7c5d4dfc0d43 store]$ mkdir v2
[db2inst1@7c5d4dfc0d43 store]$

主)

[root@node1 home]# cd /home/containerv2/
[root@node1 containerv2]# ls
v2
[root@node1 containerv2]# touch 2.txt

容器)

[db2inst1@7c5d4dfc0d43 store]$ ls
2.txt  v2
[db2inst1@7c5d4dfc0d43 store]$

验证:

docker inspect liuyang-db2-v2  # liuyang-db2-v2容器名字

        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/containerv2",
                "Destination": "/store",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"

清理

docker stop  liuyang-db2-v2  停止容器
docker rm liuyang-db2-v2   删除容器

同volumes一样,当我们清理掉容器之后,挂载目录里面的文件仍然还在,不会随着容器的结束而消失,从而实现数据持久化。

宿主机上的目录下更新了配置文件,那么只需要reload一下Consul的容器实例即可:

docker exec consul-server consul reload

五.网络

1.bridge网络模式主机网卡与容器网卡对应关系。可以通过iflink 找到对应关系。

在宿主机上执行命令ip link

$ ip link

......

13: veth56ecf40@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue mast

er docker0 state UP mode DEFAULT group default

    link/ether 56:17:10:68:88:b1 brd ff:ff:ff:ff:ff:ff link-netnsid 4

15: veth0f80cbf@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue mast

er docker0 state UP mode DEFAULT group default

    link/ether fa:e6:8f:3b:01:54 brd ff:ff:ff:ff:ff:ff link-netnsid 5

在容器内查看iflink文件

root@336043b07211:/# docker exec -it nginx-1 bash

root@336043b07211:/# cat /sys/class/net/eth0/iflink

13

root@336043b07211:/# docker exec -it nginx-2 bash

root@336043b07211:/# cat /sys/class/net/eth0/iflink

15

这样就可以确定:
nginx-1这个容器在物理机上对应的veth pair是veth56ecf40@if12;
nginx-2这个容器在物理机上对应的veth pair是veth0f80cbf@if14。

附件一

更新源

apt-get update

apt-get install net-tools  安装ifconfig工具

apt-get install vim  安装vi编辑工具

1. 如果源不好用可以更新 163 源:

原文件备份

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

修改源(直接修改,未使用vi或者vim修改)

echo "">sources.list

echo "deb mirrors.163.com/ubuntu/ artful main restricted universe multiverse">>sources.list

echo "deb mirrors.163.com/ubuntu/ artful-security main restricted universe multiverse">>sources.list

echo "deb mirrors.163.com/ubuntu/ artful-updates main restricted universe multiverse">>sources.list

echo "deb mirrors.163.com/ubuntu/ artful-proposed main restricted universe multiverse">>sources.list

echo "deb mirrors.163.com/ubuntu/ artful-backports main restricted universe multiverse">>sources.list

echo "deb-src mirrors.163.com/ubuntu/ artful main restricted universe multiverse">>sources.list

echo "deb-src mirrors.163.com/ubuntu/ artful-security main restricted universe multiverse">>sources.list

echo "deb-src mirrors.163.com/ubuntu/ artful-updates main restricted universe multiverse">>sources.list

echo "deb-src mirrors.163.com/ubuntu/ artful-proposed main restricted universe multiverse">>sources.list

echo "deb-src mirrors.163.com/ubuntu/ artful-backports main restricted universe multiverse">>sources.list

  1. ****如果源不好用可以更新阿里源:

1、原文件备份

sudo mv /etc/apt/sources.list  /etc/apt/source.list.bak

2、编辑源列表文件

sudo vim /etc/apt/sources.list

3、用下面的文本作为内容,

ubuntu 14 的版本的如下

deb mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse

deb mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse

deb mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse

deb mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse

deb mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

deb-src mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse

deb-src mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse

deb-src mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse

deb-src mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse

deb-src mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multivers

ubuntu 16 的版本

deb mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse

deb mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse

deb mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse

deb mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse

#测试版源

deb mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse

#源码

deb-src mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse

deb-src mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse

deb-src mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse

deb-src mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse

#测试版源

deb-src mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse

#Canonical 合作伙伴和附加

deb archive.canonical.com/ubuntu/ xenial partner

deb extras.ubuntu.com/ubuntu/ xenial main

3. 如果源不好用可以更新中科大镜像源:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

编辑源列表文件

sudo vim /etc/apt/sources.list

将原来的列表删除,添加如下内容(中科大镜像源)

deb mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse

deb mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse

deb mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse

deb mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse

deb mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse

deb-src mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse

deb-src mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse

deb-src mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse

deb-src mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse

deb-src mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse