docker学习(一)镜像和容器的常见用法

一、基础知识和Docker的安装

1.1 特性和背景
  1. Docker基于Go语言,是开源的容器引擎。
  2. 容器是使用沙箱机制,相互之间不会有任何接口。
  3. 应用场景
  • Web应用的自动化打包和发布。
  • 自动化测试的持续集成、发布。
  1. 优点
  • 简化程序,将应用程序和依赖的包打包到一个可移植的容器中,可以发布到任何流行的Linux机器上。
  • 可以将Web应用、后台应用、数据库应用、Hadoop集群、消息队列打包成一个镜像部署。
1.2 Docker架构
  1. Docker使用(C/S)架构,用远程API来管理和创建Docker容器。
  2. Docker容器通过Docker镜像来创建。
  3. 容器是镜像的实例,就好比对象是类的实例。
  • Docker镜像(Images):是用于创建Docker容器的模版
  • Docker容器(Container)是独立运行的一个或一组应用
  • Docker客户端(Client):Docker客户端通过命令行或者Docker API来和Docker服务端(Docker Host)的守护进程通信。
  • Docker主机(Host):一台用于执行Docker守护进程并调用Docker容器。
  • Docker仓库(Registry):用来保存镜像,例如Docker Hub。
1.3 Docker Machine

是一个简化的Docker安装的命令行工具。

二、在Ubuntu上安装Docker

  1. 需要ubuntu的内核版本高于3.10
tyson@tyson-virtual-machine:~$ uname -r
4.15.0-45-generic
  1. 安装Docker:wget -qO- https://get.docker.com/ | sh
  2. 为非root用户添加权限:tyson@tyson-virtual-machine:/root/testDocker$ sudo usermod -aG docker tyson
  3. 启动docker守护进程:tyson@tyson-virtual-machine:/root/testDocker$ sudo service docker start
  4. 测试运行hello-world
tyson@tyson-virtual-machine:/root/testDocker$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
  1. 镜像加速
tyson@tyson-virtual-machine:/root/testDocker$ sudo vim /etc/docker/daemon.json
tyson@tyson-virtual-machine:/root/testDocker$ cat /etc/docker/daemon.json 
{	
	"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
ty

三、Docker的使用

3.1 Docker Hello World
  1. 一个最简单的语法:docker+run +镜像名称+在容器中执行的命令
  • docker run ubuntu:15.10 /bin/echo "Hello world"
tyson@tyson-virtual-machine:/root/testDocker$ docker run ubuntu:15.10 /bin/echo "Hello world
> "
Unable to find image 'ubuntu:15.10' locally
15.10: Pulling from library/ubuntu
7dcf5a444392: Pull complete 
759aa75f3cee: Pull complete 
3fa871dc8a2b: Pull complete 
224c42ae46e7: Pull complete 
Digest: sha256:02521a2d079595241c6793b2044f02eecf294034f31d6e235ac4b2b54ffc41f3
Status: Downloaded newer image for ubuntu:15.10
Hello world
3.2 交互式运行容器
  1. 首先需要知道两个参数
  • -t:在容器中指定一个伪终端
  • -i:允许我对容器内的标准输入进行
    交互。
  1. 进入交互式界面后可以使用exit或者CTRL+D发送信号提出。
tyson@tyson-virtual-machine:/root/testDocker$ docker run -i -t ubuntu:15.10 /bin/bash
root@9c818b6b925b:/# cat /proc/version
Linux version 4.15.0-45-generic (buildd@lcy01-amd64-027) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)) #48~16.04.1-Ubuntu SMP Tue Jan 29 18:03:48 UTC 2019
root@9c818b6b925b:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@9c818b6b925b:/# exit
exit
3.3 后台运行容器
  1. 一些基础知识
  • 容器ID:CONTAINER ID
  • 容器名称:NAMES
  • docker ps命令,查看正在运行的容器有哪些
  • docker logs CONTANINER ID:查看容器内的标准输出
  • -d参数:后台运行容器,并返回容器ID
  • -c参数:-c指定容器开启后要执行的脚本
  1. 测试
  • 开启docker
tyson@tyson-virtual-machine:/root/testDocker$ docker run -d ubuntu:15.10 /bin/sh -c "while true;do echo hello world;sleep 1;done"
6ca18f26847aa65b82091a3ca8d57face8d92eef2e44c0e9a5beb135aecc4cb6
  • 查看正在运行的docker容器
tyson@tyson-virtual-machine:/root/testDocker$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6ca18f26847a        ubuntu:15.10        "/bin/sh -c 'while t…"   7 seconds ago       Up 4 seconds                            quirky_davinci
  • 查看docker容器的标准输出
tyson@tyson-virtual-machine:/root/testDocker$ docker logs 6ca18f26847a
hello world
tyson@tyson-virtual-machine:/root/testDocker$ docker logs quirky_davinci
hello world
hello world
  • 关闭容器
tyson@tyson-virtual-machine:/root/testDocker$ docker stop 6ca18f26847a
6ca18f26847a
tyson@tyson-virtual-machine:/root/testDocker$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

三、运行一个简单的web应用

  1. 载入含有python flask应用的docker镜像。
  • -d参数:让容器在后台运行
  • -P参数:将容器内部使用的网络端口映射到我们使用的主机上。
tyson@tyson-virtual-machine:/root/testDocker$ docker pull training/webapp
Using default tag: latest
latest: Pulling from training/webapp
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
  1. 开启容器
tyson@tyson-virtual-machine:/root/testDocker$ docker run -d -P training/webapp python app.py
b0aa7eb6c9387680c6fd58b68cd00bc336a334f539df62290ca18c0b4666180b

  1. 查看正在运行的容器列表
  • 可以看到多了端口信息
tyson@tyson-virtual-machine:/root/testDocker$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
b0aa7eb6c938        training/webapp     "python app.py"     7 seconds ago       Up 5 seconds        0.0.0.0:32768->5000/tcp   frosty_goldwasser

在这里插入图片描述

  • 当然我们也可以自行指定端口
tyson@tyson-virtual-machine:/root/testDocker$ docker run -p 5000:5000 -d training/webapp python app.py
7de8567d0359b21a38514730eec29fe94c0ce8048e36f50088991e9b90f76ec6
tyson@tyson-virtual-machine:/root/testDocker$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
7de8567d0359        training/webapp     "python app.py"     11 seconds ago      Up 3 seconds        0.0.0.0:5000->5000/tcp    jovial_shockley
b0aa7eb6c938        training/webapp     "python app.py"     3 minutes ago       Up 3 minutes        0.0.0.0:32768->5000/tcp   frosty_goldwasser
  1. 快速查看网络端口的映射情况
  • docker ps
  • docker port CONTAINER_NAME
tyson@tyson-virtual-machine:/root/testDocker$ docker port jovial_shockley
5000/tcp -> 0.0.0.0:5000
tyson@tyson-virtual-machine:/root/testDocker$ docker prot frosty_goldwasser
docker: 'prot' is not a docker command.
See 'docker --help'
tyson@tyson-virtual-machine:/root/testDocker$ docker port frosty_goldwasser
5000/tcp -> 0.0.0.0:32768
  • 通过 docker logs -f 来查看追加式的标准输出(类似于tail)
tyson@tyson-virtual-machine:/root/testDocker$ docker logs -f jovial_shockley
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.0.105 - - [20/Feb/2019 08:35:12] "GET / HTTP/1.1" 200 -
192.168.0.105 - - [20/Feb/2019 08:35:13] "GET /favicon.ico HTTP/1.1" 404 -
192.168.0.105 - - [20/Feb/2019 08:42:05] "GET / HTTP/1.1" 200 -
192.168.0.105 - - [20/Feb/2019 08:42:07] "GET / HTTP/1.1" 200 -
  • 通过docker inspect来查看Docker容器的配置和状态信息

  • 停止docker容器:
    docker stop NAME

  • 查看最后一次创建的容器(已经创建过但是被停止的不算。也就是start跑起来的不算)
    docker ps -l

tyson@tyson-virtual-machine:~$ docker stop tyson_selenium
tyson_selenium
tyson@tyson-virtual-machine:~$ docker run -d -P --name new_run training/webapp python app.py
ae2e2ed2cd086749e93b6e45ccfba7cb4130e51bcc18fa5fe2642f50d7acf925
tyson@tyson-virtual-machine:~$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
ae2e2ed2cd08        training/webapp     "python app.py"     6 seconds ago       Up 3 seconds        0.0.0.0:32774->5000/tcp   new_run
tyson@tyson-virtual-machine:~$ docker start tyson_selenium
tyson_selenium
tyson@tyson-virtual-machine:~$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
ae2e2ed2cd08        training/webapp     "python app.py"     25 seconds ago      Up 23 seconds       0.0.0.0:32774->5000/tcp   new_run
  • 启动已经运行过的容器,运用原来的配置:docker start NAME

  • 重启正在运行的容器:socker restart NAME

  • 移除已经创建的容器(容器必须已经停止):docker rm NAME

tyson@tyson-virtual-machine:/root/testDocker$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
7de8567d0359        training/webapp     "python app.py"     18 minutes ago      Up 2 minutes        0.0.0.0:5000->5000/tcp    jovial_shockley
b0aa7eb6c938        training/webapp     "python app.py"     22 minutes ago      Up 22 minutes       0.0.0.0:32768->5000/tcp   frosty_goldwasser
tyson@tyson-virtual-machine:/root/testDocker$ docker rm jovial_shockley
Error response from daemon: You cannot remove a running container 7de8567d0359b21a38514730eec29fe94c0ce8048e36f50088991e9b90f76ec6. Stop the container before attempting removal or force remove

四、Docker镜像的相关操作

4.1 管理和使用本地Docker主机镜像
  1. 列出镜像列表
  • REPOSITORY 镜像的仓库源
  • TAG:镜像的表镜,一般用来标识版本,同一个仓库员可以有多个不同的TAG,所以我们定义镜像的方式是:REPOSITORY:TAG,例如ubuntu:15.10。如果不指定TAG,默认是启动latest的版本。
docker run -t -i ubuntu:15.10 /bin/bash
docker run -t -i ubutu:14.04 /bin/bash
  • IMAGE ID:镜像ID
  • CREATED:镜像的创建时间
  • SIZE:镜像大小
tyson@tyson-virtual-machine:/root/testDocker$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        7 weeks ago         1.84kB
ubuntu              15.10               9b9cb95443b5        2 years ago         137MB
training/webapp     latest              6fae60ef3446        3 years ago         349MB
  1. 获取新版本镜像:docker pull REPOSITORY:TAG

  2. 查找镜像::docker search REPOSITORY

  • NAME:镜像仓库源的名称,也就是我们制定的REPOSITORY
  • DESCRIPTION:镜像的描述
  • OFFICIAL:是否为docker官方发布
  1. 拖取镜像:docker pull REPOSITORY(NAME)

  2. start 和 run

  • docker start的作用是,重新启动已存在的镜像。也就是说,如果使用这个命令,我们必须事先知道这个容器的ID,或者这个容器的名字,我们可以使用docker ps找到这个容器的信息。
  • docker run相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start)。
4.2 定制自己的镜像
  1. 更新已经从docker hub拉取的镜像
  • 先创建容器
  • 在运行的容器内用apt-get update命令进行更新
tyson@tyson-virtual-machine:/root/testDocker$ docker run -t -i ubuntu:15.10
root@84b9368fa3ff:/# apt-get update
  • 完成更新操作后,exit退出
  • docker commit来提交我们更新过的容器的副本:docker commit -m="描述信息" -a="镜像作者" 容器ID 需要创建的目标镜像名
exit
tyson@tyson-virtual-machine:/root/testDocker$ docker commit -m="has update" -a="tyson" 84b9368fa3ff tyson-ubuntu:v2
sha256:bd9a2b7838b4831b7f733a8eb607ee1b40541f1670d33bc2273211a81e3335e6
  • 查看并运行镜像
tyson@tyson-virtual-machine:/root/testDocker$ docker run -i -t tyson-ubuntu:v2 /bin/bash
root@44543dd889ca:/# exit
exit
  1. 用docker build构建镜像
  • 首先我们需要一个名为Dockerfile的文件,并对其进行配置
tyson@tyson-virtual-machine:~/learnDocker$ ll
total 12
drwxrwxr-x  2 tyson tyson 4096 2月  21 00:08 ./
drwxr-xr-x 27 tyson tyson 4096 2月  21 00:08 ../
-rw-rw-r--  1 tyson tyson  252 2月  21 00:08 Dockerfile
tyson@tyson-virtual-machine:~/learnDocker$ cat Dockerfile 
FROM centos:6.7
MAINTAINER Tyson "chinamen520@qq.com"

RUN /bin/echo 'root:123456' |chpasswd
RUN useradd tyson
RUN /bin/echo 'tyson:tysonpw' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"">/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
  • 指令FROM:指定镜像源
  • 指令RUN:而RUN则是用户使用docker run创建容器之后,容器内的系统会执行的指令。
  • 然后我们在Dockerfile所在的目录中使用docker build来构建镜像。语法格式是:docker build -t RESPOSITORY:TAG DIR,其中RESPOSITORY则是镜像的名称,TAG往往是版本,而DIR则是Dockerfile所在的目录。
tyson@tyson-virtual-machine:~/learnDocker$ docker build -t tysonbuild/centos:6.7 .
Sending build context to Docker daemon  2.048kB
Step 1/9 : FROM centos:6.7
6.7: Pulling from library/centos
cbddbc0189a0: Pull complete 
  • 构建镜像完成后检查
tyson@tyson-virtual-machine:~/learnDocker$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tysonbuild/centos   6.7                 65df870170d6        2 minutes ago       191MB
tyson-ubuntu        v2                  bd9a2b7838b4        6 hours ago         137MB
hello-world         latest              fce289e99eb9        7 weeks ago         1.84kB
centos              6.7                 192ad0341c8b        4 months ago        191MB
ubuntu              15.10               9b9cb95443b5        2 years ago         137MB
training/webapp     latest              6fae60ef3446        3 years ago         349MB
  • 创建容器
tyson@tyson-virtual-machine:~/learnDocker$ docker run -t -i tysonbuild/centos:6.7 /bin/bash
[root@68e3adf32b5f /]# id tyson
uid=500(tyson) gid=500(tyson) groups=500(tyson)
  • 我们可以用docker tag为同一个容器设置多个TAG
tyson@tyson-virtual-machine:~/learnDocker$ docker tag 65df870170d6 tyosnbuild/centos:myenv01
tyson@tyson-virtual-machine:~/learnDocker$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tyosnbuild/centos   myenv01             65df870170d6        22 minutes ago      191MB
tysonbuild/centos   6.7                 65df870170d6        22 minutes ago  
  • 但是在创建容器的时候,不允许使用自定义的tag来创建容器。
tyson@tyson-virtual-machine:~/learnDocker$ docker run -d tysonbuild/centos:6.7
2b86cf204a527372c95bbae7fab4aa49738bede238f587ed723344e9b5fac2c3
tyson@tyson-virtual-machine:~/learnDocker$ docker run -d tysonbuild/centos:myenv01
Unable to find image 'tysonbuild/centos:myenv01' locally
^C
tyson@tyson-virtual-machine:~/learnDocker$ docker stop 2b86cf204a527372c95bbae7fab4aa49738bede238f587ed723344e9b5fac2c3
2b86cf204a527372c95bbae7fab4aa49738bede238f587ed723344e9b5fac2c3
  • 最后,我们需要清除区分容器ID和镜像ID。我们使用docker images查看的是镜像信息,IMAGE ID是镜像的ID。而我们通过将相应镜像装入容器后会得到容器ID(CONTAINER ID ),这个ID我们是通过docker ps查看的,我们通过docker stop来停止某容器是假对应的CONTAINER ID 。

五、Docker 容器连接

5.1 用端口连接到一个docker容器

我们可以通过随机指定主机高位端口、自行指定主机端口两种方式来绑定主机端口和容器对应端口。我们还可以指定主机对应地址的方式来绑定容器的对应端口。

  1. 用主机随机高位端口绑定容器端口。
  • -P选项。
tyson@tyson-virtual-machine:~$ docker run -P -d training/webapp
7205890610ece31dddd61f93b21dc5fdb38941d45390bc82a67ea4653312239d
tyson@tyson-virtual-machine:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
7205890610ec        training/webapp     "python app.py"     8 seconds ago       Up 7 seconds        0.0.0.0:32768->5000/tcp   pensive_keldysh
tyson@tyson-virtual-machine:~$ docker run -P -d training/webapp
66d22f1ff84268ef319a8e82f151b310e97a4173f3fa004a82e3696d81111ef3
tyson@tyson-virtual-machine:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
66d22f1ff842        training/webapp     "python app.py"     3 seconds ago       Up 2 seconds        0.0.0.0:32769->5000/tcp   confident_ride
7205890610ec        training/webapp     "python app.py"     19 seconds ago      Up 18 seconds       0.0.0.0:32768->5000/tcp   pensive_keldysh
  1. 自行指定主机IP绑定容器IP
  • -p选项:注意必须是以主机ip:容器内服务的ip这种形式去指定
tyson@tyson-virtual-machine:~$ docker run -p 5200:5000 -d training/webapp
5e6e52aac5f9d44afaa9abf26fa5ae677a6a740ffead6a62916ac36d4953157c

在这里插入图片描述

  1. 用主机的网络地址绑定容器端口
tyson@tyson-virtual-machine:~$ docker run -p 192.168.0.109:5100:5000 -d training/webapp
  1. 我们还可以指定协议,例如我们要指定udp协议
tyson@tyson-virtual-machine:~$ docker run -p 192.168.0.109:51001:5000/udp -d training/webapp
e22233648852ba84a53d8edc0e41d9230842cf1ec89aac155eb5e3140d2d641f
  1. 通过docker psdocker port CONTANINER_NAME CONTAINER_PORT来查看对应绑定的主机IP是哪个
  • docker ps
tyson@tyson-virtual-machine:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                                     NAMES
e22233648852        training/webapp     "python app.py"     54 seconds ago       Up 53 seconds       5000/tcp, 192.168.0.109:51001->5000/udp   inspiring_aryabhata
1e82771df1e8        training/webapp     "python app.py"     About a minute ago   Up About a minute   192.168.0.109:5100->5000/tcp              happy_davinci
5e6e52aac5f9        training/webapp     "python app.py"     5 minutes ago        Up 4 minutes        0.0.0.0:5200->5000/tcp                    elegant_agnesi
cfdade06affa        training/webapp     "python app.py"     7 minutes ago        Up 7 minutes        5000/tcp, 0.0.0.0:32771->5200/tcp         distracted_dubinsky
7851a74b629b        training/webapp     "python app.py"     10 minutes ago       Up 10 minutes       127.0.0.1:1234->5000/tcp                  stoic_volhard
9ff9f08e4387        training/webapp     "python app.py"     10 minutes ago       Up 10 minutes       127.0.0.1:1->5000/tcp                     nifty_hopper
ba5cde734a5a        training/webapp     "python app.py"     21 minutes ago       Up 21 minutes       5000/tcp, 0.0.0.0:32770->5200/tcp         wonderful_johnson
66d22f1ff842        training/webapp     "python app.py"     22 minutes ago       Up 22 minutes       0.0.0.0:32769->5000/tcp                   confident_ride
7205890610ec        training/webapp     "python app.py"     22 minutes ago       Up 22 minutes       0.0.0.0:32768->5000/tcp                   pensive_keldysh
  • docker port CONTANINER_NAME CONTAINER_PORT
tyson@tyson-virtual-machine:~$ docker port pensive_keldysh 5000
0.0.0.0:32768
5.2 通过docker的连接系统连接父子容器
  • 父容器可以看到子容器的信息。
5.3 为容器指定好看的名称
  • --name yourname
  • eg:docker run -d -P --name tyson_selenium training/webapp python app.py
tyson@tyson-virtual-machine:~$ docker ps|grep tyson
55ca0ce18a71        training/webapp     "python app.py"     8 seconds ago       Up 7 seconds        0.0.0.0:32773->5000/tcp                   tyson_selenium
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值