docker学习笔记


title: docker学习笔记
date: 2017-11-19 21:43:49
tags: Docker
categories: Linux


Docker基础概念

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 镜像是用于创建 Docker 容器的模板。
Docke 容器是独立运行的一个或一组应用。
Docker 仓库用来保存镜像。

Docker常用命令

镜像操作

下载镜像

docker pull ubuntu

搜索镜像nginx

docker search nginx

列出所有镜像

➜  ~ docker image ls                  
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              113a43faa138        3 weeks ago         81.2MB
hello-world         latest              e38bc07ac18e        2 months ago        1.85kB

包含了仓库名,标签,镜像 ID,创建时间和占用大小。

删除镜像

docker image rm hello-world

容器操作

启动容器

docker run hello-world

docker run会直接启动镜像,产生一个容器。

参数 -i -t会产生交互式命令

➜  ~ docker run -t -i ubuntu /bin/bash
root@211a08dade54:/#  cat /etc/issue
Ubuntu 18.04 LTS \n \l

带参数为 -d后台启动 --name 可以自定义容器名称

➜  ~ docker run -d --name=hello hello-world 
3c71798fb3fb471d6ccd11b0cddd4c38d88ee9b59e40769f87d598e6c3563257

查看日志

➜  ~ docker logs hello                
Hello from Docker!
This message shows that your installation appears to be working correctly.

可以查看刚才启动的hello容器的输出日志。

查看正在运行中的容器

➜  ~ docker ps          
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
fdc7936d58b4        nginx               "nginx -g 'daemon of…"   2 seconds ago       Up 1 second         80/tcp              amazing_jepsen

查看所有的容器

➜  ~ docker container ls -a                  
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
a8178337139d        hello-world         "-d --name hello"   38 seconds ago      Created                                         keen_shtern
ea14c9b032ce        ubuntu              "/bin/bash"         53 seconds ago      Exited (0) 52 seconds ago                       keen_chandrasekhar

会显示容器ID,镜像,启动命令,创建时间,状态,端口,名称等信息。

停止/启动/重启 容器

docker container stop/start/restart ea14c9b032ce

进入容器交互

docker exec -it ea14c9b032ce bash

查看容器元数据

docker inspect hello

会列出容器的各种基础信息

删除容器

docker container rm ea14c9b032ce

删除所有终止容器

docker container prune

数据管理

1.使用 -v 参数

-v PWD1:PWD2 将宿主机目录PWD1挂载到容器内目录PWD2

➜  ~ docker run -i -t -v $PWD/test.txt:/home/test.txt  ubuntu
root@f2a683801ffd:/# ls /home
test.txt

2.使用volume 数据卷

创建数据卷

docker volume create my-vol

列出所有的数据卷

docker volume ls

查看数据卷信息

➜  Downloads docker volume inspect my-vol
[
    {
        "CreatedAt": "2018-07-03T22:43:25+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

删除数据卷

docker volume rm my-vol

删除无主的数据卷

docker volume prune

挂载数据卷

➜  ~ docker run -t -i --mount source=my-vol,target=/home/ ubuntu /bin/bash
root@e3b9b5a3936d:/# touch /home/test.txt

➜  ~ ls /var/lib/docker/volumes/my-vol/_data 
test.txt

使用--mount source=数据卷, target=容器目录 进行挂载 ,数据卷是持久化的,不会自动删除。默认是可读写的。

网络访问

随机端口映射

➜  ~ docker run -d -P nginx
058f1e6909b52b7cb75f9955ee0039407203dd62d2ac07f82219cceaf820e6a5
➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
058f1e6909b5        nginx               "nginx -g 'daemon of…"   18 seconds ago      Up 17 seconds       0.0.0.0:1024->80/tcp   modest_aryabhata

使用大写-P参数会将宿主机的端口随机映射到容器。如上例,本地主机的1024端口被映射到了容器的80端口,此时访问http://127.0.0.1:1024/就可以查看到nginx主页。

指定端口映射

➜  ~ docker run -d -p 80:80 nginx                
f92cc24e5bfe11cbadfc6c15e5477f4ad78e272e9db3a59996f59776f8b58e11
➜  ~ curl 127.0.0.1:80 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

使用小写-p参数可以指定端口映射。

容器互联

新建网络

docker network create -d bridge my-net

连接容器

➜  ~ docker run -it --name test1 --network my-net busybox sh
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:00:02  
          inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:19 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2813 (2.7 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
---

➜  ~ docker run -it --name test2 --network my-net busybox sh
/ # ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.212 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.184 ms

此时,test1容器和test2可以相互访问。

创建新的镜像

1.使用 docker commit

以使用ubuntu镜像制作python3为例

➜  ~ docker run -it ubuntu /bin/bash
root@9cac2dab97dd:/# apt update
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [83.2 kB]    
...
root@9cac2dab97dd:/# apt install python3
Reading package lists... Done
...
➜  ~ docker commit --author='tester' --message='安装python3' 9cac2dab97dd my-python3
sha256:9211535c8668b7e4cc195504326a3903b0a7c9fdbbb599a5acabbc06aae1c92e
➜  ~ docker run -ti my-python3 /usr/bin/python3
Python 3.6.5 (default, Apr  1 2018, 05:46:30) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

docker commit 方法是用来在现有镜像的基础上生成新镜像的,不过不推荐这种方法。

2.使用 docker file

还是以制作python3为例,创建Dockerfile文件

FROM ubuntu
RUN apt update&&apt install -y python3
CMD ["python3"]

使用docker build构建镜像
docker build -t my-python3 .
运行

➜  docker run -ti my-python3
Python 3.6.5 (default, Apr  1 2018, 05:46:30) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

导入导出镜像

保存镜像

docker save hello-world |gzip hello.tar.gz

导入镜像

docker load -i hello.tar.gz

这种方法适用于直在没有网络时进行镜像传输

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值