Docker基础操作

Docker部署

Docker安装

[root@docker01 ~]# yum remove docker docker-common docker-selinux docker-engine
[root@docker01 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@docker01 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
[root@docker01 ~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#' /etc/yum.repos.d/docker-ce.repo
[root@docker01 ~]# yum makecache fast
[root@docker01 ~]# yum install docker-ce -y
[root@docker01 ~]# docker version
[root@docker01 ~]# systemctl start docker
[root@docker01 ~]# systemctl enable docker
[root@docker01 ~]# docker version

镜像加速

#官网地址
https://www.daocloud.io/mirror
#加速命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

#阿里镜像加速地址
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
#加速命令
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

Docker 基础命令

[root@docker01 ~]# docker --help
Usage:
docker [OPTIONS] COMMAND [arg...]
       docker daemon [ --help | ... ]
       docker [ --help | -v | --version ]

A
self-sufficient runtime for containers.

Options:
      --config string      Location of client config files (default "/root/.docker")    #客户端配置文件的位置
  -D, --debug=false               Enable debug mode  #启用Debug调试模式
  -H, --host=[]                   Daemon socket(s) to connect to  #守护进程的套接字(Socket)连接
  -h, --help=false                Print usage  #打印使用
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")    #设置日志级别
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")    #信任证书签名CA
      --tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")    #TLS证书文件路径
      --tlskey string      Path to TLS key file (default "/root/.docker/key.pem")    #TLS密钥文件路径
      --tlsverify          Use TLS and verify the remote    #使用TLS验证远程
  -v, --version            Print version information and quit    #打印版本信息并退出

......

Commands:
    attach    Attach to a running container  #当前shell下attach连接指定运行镜像
    build     Build an image from a Dockerfile  #通过Dockerfile定制镜像
    commit    Create a new image from a container's changes  #提交当前容器为新的镜像
    cp    Copy files/folders from a container to a HOSTDIR or to STDOUT  #从容器中拷贝指定文件或者目录到宿主机中
    create    Create a new container  #创建一个新的容器,同run 但不启动容器
    diff    Inspect changes on a container's filesystem  #查看docker容器变化
    events    Get real time events from the server  #从docker服务获取容器实时事件
    exec    Run a command in a running container   #在已存在的容器上运行命令
    export    Export a container's filesystem as a tar archive  #导出容器的内容流作为一个tar归档文件(对应import)
    history    Show the history of an image  #展示一个镜像形成历史
    images    List images  #列出系统当前镜像
    import    Import the contents from a tarball to create a filesystem image  #从tar包中的内容创建一个新的文件系统映像(对应export)
    info    Display system-wide information  #显示系统相关信息
    inspect    Return low-level information on a container or image  #查看容器详细信息
    kill    Kill a running container  #kill指定docker容器
    load    Load an image from a tar archive or STDIN  #从一个tar包中加载一个镜像(对应save)
    login    Register or log in to a Docker registry    #注册或者登陆一个docker源服务器
    logout    Log out from a Docker registry  #从当前Docker registry退出
    logs    Fetch the logs of a container  #输出当前容器日志信息
    pause    Pause all processes within a container   #暂停容器
    port    List port mappings or a specific mapping for the CONTAINER  #查看映射端口对应的容器内部源端口
    ps    List containers  #列出容器列表
    pull    Pull an image or a repository from a registry  #从docker镜像源服务器拉取指定镜像或者库镜像
    push    Push an image or a repository to a registry  #推送指定镜像或者库镜像至docker源服务器
    rename    Rename a container  #重命名容器
    restart    Restart a running container  #重启运行的容器
    rm    Remove one or more containers  #移除一个或者多个容器
    rmi    Remove one or more images  #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
    run    Run a command in a new container  #创建一个新的容器并运行一个命令
    save    Save an image(s) to a tar archive    #保存一个镜像为一个tar包(对应load)
    search    Search the Docker Hub for images  #在docker hub中搜索镜像
    start    Start one or more stopped containers   #启动容器
    stats    Display a live stream of container(s) resource usage statistics  #统计容器使用资源
    stop    Stop a running container  #停止容器
    tag         Tag an image into a repository  #给源中镜像打标签
    top       Display the running processes of a container #查看容器中运行的进程信息
    unpause    Unpause all processes within a container  #取消暂停容器
    version    Show the Docker version information   #查看容器版本号
    wait         Block until a container stops, then print its exit code  #截取容器停止时的退出状态值

Docker镜像管理

搜索镜像docker search

[root@docker01 ~]# docker search nginx
NAME(名称)                      DESCRIPTION (描述)                            STARS(下载次数)    OFFICIAL(官方)    AUTOMATED(自动化创建)
nginx                             Official build of Nginx.                        12451               [OK]                
jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con…   1715                                    [OK]

镜像选择建议

  • 优先考虑官方
  • stars数量最多

获取镜像docker pull

默认获取最新

[root@docker01 ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
729ec3a6ada3: Pull complete 
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

指定版本获取
搜索镜像并查看该镜像的 tag 默认我们使用命令查看是看不到镜像的版本的,可以通过 docker-hub 查看,但是国内原因很慢, 这里可以使用仓库的 restful API 来查询 jq 是一个 json 格式化工具,需要提前安装 。

[root@docker01 ~]# yum install jq
[root@docker01 ~]# curl -s https://registry.hub.docker.com/v1/repositories/centos/tags|jq 
说明:更换镜像名查看其它镜像就可以,这里将centos更换成其它的镜像名即可。
[root@docker01 ~]# curl -s https://registry.hub.docker.com/v1/repositories/nginx/tags|jq 
[root@docker01 ~]# docker pull centos:7

私有仓库镜像pull

docker pull 镜像下载地址

查看镜像列表

[root@docker01 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              f7bb5701a33c        10 days ago         126MB
centos              7                   5e35e350aded        8 weeks ago         203MB
centos              latest              0f3e07c0138f        3 months ago        220MB
[root@docker01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              f7bb5701a33c        10 days ago         126MB
centos              7                   5e35e350aded        8 weeks ago         203MB
centos              latest              0f3e07c0138f        3 months ago        220MB

[root@docker01 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              f7bb5701a33c        10 days ago         126MB
centos              7                   5e35e350aded        8 weeks ago         203MB
centos              latest              0f3e07c0138f        3 months ago        220MB
列表包括了仓库名、标签、镜像ID、创建时间以及所占用的空间。镜像ID则是镜像的唯一标识,一个镜像可以对应多个标签。

删除镜像
说明:使用docker rmi 删除本地镜像,后面可以跟镜像ID或者标签。(删除镜像之前先用docker rm 删除依赖于这个镜像的所有容器)。注意docker rm 命令是移除容器。

docker    rmi    [选项]    <镜像1>    [<镜像2>    ...]

docker rmi imageID/imageName/  

导出镜像 docker save
如果要导出镜像到本地,提供给另外一台机使用,可以使用docker save 或者docker image save 命令。

Docker save 镜像名称:tag -o 自定义名称.tar
[root@docker01 ~]# docker save nginx:latest -o nginx.tar.gz
[root@docker01 ~]# ls
nginx.tar.gz         
[root@docker01 ~]# docker save nginx >/tmp/nginx1.tar.gz
[root@docker01 ~]# ls /tmp/
nginx1.tar.gz      

导入镜像
通过docker save导出的镜像,通常需要通过docker load 导入,命令如下:
Docker load -i 名称.tar

[root@docker01 ~]# docker load -i nginx.tar.gz

[root@docker01 ~]# docker load 

镜像打标签

[root@docker01 ~]# docker tag nginx:latest nginx:1.16.1
[root@docker01 ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
centos_nginxsrc                v6                  7ed8dee10e66        2 days ago          541MB
nginx                          1.16.1              c7460dfcab50        3 days ago          126MB
nginx                          latest              c7460dfcab50        3 days ago          126MB

Docker容器管理

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一种是将在终止状态(stopped)的容器重新启动。

因为Docker的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。所以主要命令还是docker run
新建容器

[root@docker01 ~]# docker create -it centos /bin/bash #创建一个容器
77cabb640f4d2f18aca3449c96aa2467c763b7f0683ca89345465cfefa82b7eb

[root@docker01 ~]# docker ps -a  #查看所有容器的状态
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
77cabb640f4d        centos              "/bin/bash"         11 seconds ago      Created                                 ecstatic_ride
[root@docker01 ~]# docker start 77cabb640f4d  #根据id启动之前的容器
77cabb640f4d
[root@docker01 ~]# docker ps #查看处于运行状态的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
77cabb640f4d        centos              "/bin/bash"         41 seconds ago      Up 6 seconds                            ecstatic_ride
[root@docker01 ~]# docker attach 77cabb640f4d #根据id进入到容器中
[root@77cabb640f4d /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@77cabb640f4d ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 03:48 pts/0    00:00:00 /bin/bash
root         16      1  0 03:49 pts/0    00:00:00 ps -ef
[root@77cabb640f4d ~]# exit  #退出容器
exit

新建容器并启动docker run

#参数
-i, --interactive 交互式
-t, --tty 分配一个伪终端
-d, --detach 运行容器到后台
-a, --attach list 附加到运行的容器
--dns list 设置DNS服务器
-e, --env list 设置环境变量
--env-file list 从文件读取环境变量
-p, --publish list 发布容器端口到主机
-P, --publish-all 发布容器所有EXPOSE的端口到宿主机随机端口
-h, --hostname string 设置容器主机名
--ip string 指定容器IP,只能用于自定义网络
--link list 添加连接到另一个容器
--network 连接容器到一个网络
--mount mount 挂载宿主机分区到容器
-v, --volume list 挂载宿主机目录到容器
--restart string,容器退出时重启策略,默认no [always|on-failure]
--add-host list 添加其他主机到容器中/etc/hosts
-m,--memory 容器可以使用的最大内存量
--memory-swap 允许交换到磁盘的内存量--memory-swappiness=<0-100> 容器使用SWAP分区交换的百分比(0-100,默认为-1)
--memory-reservation 内存软限制,Docker检测主机容器争用或内存不足时所激活的软 限制,使用此选项,值必须设置低于—memory,以使其优先
--oom-kill-disable当宿主机内存不足时,内核会杀死容器中的进程。建议设置了memory选项再禁用OOM。如果没有设置,主机可能会耗尽内存
--cpus 限制容器可以使用多少可用的CPU资源
--cpuset-cpus 限制容器可以使用特定的CPU
--cpu-shares  此值设置为大于或小于默认1024值,以增加或减少容器的权重, 并使其可以访问主机CPU周期的更大或更小比例

例如:执行下面命令输出一个"hello world",之后容器自动终止。

[root@docker01 ~]# docker run -it centos echo "hello world"
hello world #这里是因为默认替换了CMD的执行主行主程序的命令,其真实执行的是CMD ["sh" ,"-c" ,"echo "hello world""] sh被认为是主程序,执行完成后退出,所以容器也就自动关闭。
[root@docker01 ~]# docker run -it centos /bin/echo "hello world"
hello world  

启动一个bash终端,允许用户进行交互

[root@docker01 ~]# docker run --name centos7 -it centos /bin/bash
[root@45c206cfbb6f /]# pwd
/
--name: 给容器定义一个名称
-t:让Docker分配一个伪终端并绑定到容器的标准输入上
-i:让容器的标准输入保持打开
/bin/bash:执行一个命令

当利用docker run 来创建容器时,Docker在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
  • 利用镜像创建一个容器,并启动该容器;
  • 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
  • 从网桥的地址池配置一个 IP 地址给容器;
  • 执行用户指定的应用程序;
  • 执行完毕后容器被自动终止。

启动已经终止的容器卷
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其他的资源。可以在伪终端利用 ps 或 top 来查看进程信息。
docker ps -a 可以查看所有容器的情况,docker ps 查看已启动容器的情况

[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@docker01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
45c206cfbb6f        centos              "/bin/bash"              2 hours ago         Exited (0) 9 seconds ago                       centos7
7c2b1ef25d95        centos              "/bin/bash"              2 hours ago         Exited (0) 2 hours ago                         dazzling_khayyam
49ca5a318bcf        centos              "/bin/echo 'hello wo…"   2 hours ago         Exited (0) 2 hours ago                         agitated_hoover
90edf30620ef        centos              "echo 'hello world'"     2 hours ago         Exited (0) 2 hours ago                         happy_wescoff
77cabb640f4d        centos              "/bin/bash"              3 hours ago         Exited (0) 3 hours ago     
[root@docker01 ~]# docker start 45c206cfbb6f
45c206cfbb6f
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
45c206cfbb6f        centos              "/bin/bash"         2 hours ago         Up 6 seconds     

停止容器
可以使用 docker stop 来终止一个正在运行的容器。

此外,当Docker容器中指定的应用终结时,容器也会自动终结,例如启动一个终端容器,用户通过exit命令或者Ctrl+d 来退出终端时,所创建的容器立刻终止。

终止状态的容器可以用 docker ps -a 命令看到,也可以通过 docker start 命令来重新启动。

[root@docker01 ~]# docker stop 45c206cfbb6f
45c206cfbb6f
[root@docker01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
45c206cfbb6f        centos              "/bin/bash"              2 hours ago         Exited (0) 9 seconds ago      

后台进程运行
守护进程运行(后台运行)
更多的时候,需要让Docker容器在后台运行,而不是直接把执行命令的结果输出在当前宿主机下。此时可以加 -d 参数来实现。

[root@docker01 ~]# docker run -d centos /bin/bash -c "while true; do echo hello world; sleep 1; done" 
b218728ce7f5345e991cd0b1c5331e66447aa13ab521261ad46b8c444f402620
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b218728ce7f5        centos              "/bin/bash -c 'while…"   6 seconds ago       Up 5 seconds                            kind_proskuriakova
[root@docker01 ~]# docker logs b218728ce7f5  #获取容器输出的信息,通过docker logs命令获取
hello world
hello world
hello world

进入程序
在使用 -d 参数时,容器启动后会进入后台,某些时候需要进入容器进行操作,有很多种房,包括 docker attach 命令或者 docker exec命令等。
attach命令
docker attach 是Docker自带的命令、

[root@docker01 ~]# docker run -itd centos
39b8b0ab96d45b3320517aa44ce30867a5cdd3d05c341bde161b95264bddf55f
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
39b8b0ab96d4        centos              "/bin/bash"         19 seconds ago      Up 19 seconds                           modest_keller
[root@docker01 ~]# docker attach 39b8b0ab96d4
[root@39b8b0ab96d4 /]# 
[root@39b8b0ab96d4 /]# exit
exit
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

但是使用attach命令有时候并不方便,当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示,当某个窗口因命令阻塞,其他窗口也无法执行操作了。且通过exit退出后容器就自动终止了。
exec命令
exec 可以在容器内直接执行任意命令,此处我们也可以使用它进入到容器里面

[root@docker01 ~]# docker run -itd centos
d8e133187bf8a53f101b1e29e250d34733cbabadbd6ad5ec42f933db9da42987
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d8e133187bf8        centos              "/bin/bash"         53 seconds ago      Up 52 seconds                           exciting
[root@docker01 ~]# docker exec -it d8e133187bf8 /bin/bash
[root@d8e133187bf8 /]# 
[root@d8e133187bf8 /]# exit
exit
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d8e133187bf8        centos              "/bin/bash"         4 minutes ago       Up 4 minutes                            exciting_euclid

导出和导入容器
Docker commit
(1).通过容器自作镜像(只有容器才有写入权限,但是一旦停止,写入的就会丢失,如果想保留,可以通过docker commit制作镜像进行保留)
注:只有docker export制作的镜像可以默认拷贝至其他的平台,docker commit制作的镜像默认在images列表,默认的不是一个tar文件,导出操作如下:
Docker commit 容器ID -m(说明)镜像名称:tag
导出docker images 列表中的镜像
Docker save 镜像名称:tag -o 自定义名称.tar
通过docker save导出的镜像,通常需要通过docker load 导入,命令如下:
Docker load -i 名称.tar
2.Docker export
将当前的 容器导成一个tar镜像文件;
Docker export 容器ID -o 自定义名称.tar/tar.gz
将tar镜像文件导入当前列表,并自定义名称版本:
Docker import 镜像文件.tar/tar.gz 镜像名称:tag

#导出镜像
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATU
d8e133187bf8        centos              "/bin/bash"         4 minutes ago       Up 4 
[root@docker01 ~]# docker export d8e133187bf8 -o centos7.tar.gz
[root@docker01 ~]# ls
centos7.tar.gz  
#导入镜像
[root@docker01 ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
centos                         7.1                 7f663fdb1dc1        9 seconds ago       220MB                  

容器删除
使用 docker rm 来删除一个处于终止状态的容器。

[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d8e133187bf8        centos              "/bin/bash"         15 minutes ago      Up 15 minutes                           exciting_euclid
#先停止docker
[root@docker01 ~]# docker stop d8e133187bf8
d8e133187bf8
#再删除容器
[root@docker01 ~]# docker rm d8e133187bf8
d8e133187bf8

如果要删除一个运行中的容器,可以添加 -f 参数。 Docker会发送 STGKILL信号给容器,再进行删除。
清理所有处于终止状态的的容器(慎用)

[root@docker01 ~]# docker run -itd centos
ba42dbe0296bea8a9a626553ce3694d1a17b67e82e51ff1aba25463df3990cde
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ba42dbe0296b        centos              "/bin/bash"         12 seconds ago      Up 11 seconds                           funny_kirch
[root@docker01 ~]# docker rm -f ba42dbe0296b
ba42dbe0296b

Docker的数据卷管理

Docker 容器中管理数据主要有两种方式:

数据卷(Data volumes)
数据卷容器(Data volumes containers)
数据卷
数据卷是一个可供一个或者多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即时容器被删除
    管理数据卷
[root@docker01 ~]# docker volume create myvolume #创建一个数据卷
myvolume
[root@docker01 ~]# docker volume inspect myvolume #查看数据卷的信息
[
    {
        "CreatedAt": "2020-01-13T16:05:38+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
        "Name": "myvolume",
        "Options": {},
        "Scope": "local"
    }
]
[root@docker01 ~]# docker volume ls #查看数据列表
local               myvolume

用卷创建一个容器

[root@docker01 ~]# docker run -itd --name mycentos --mount src=myvolume,dst=/data centos
4a027fe9f4a9de6767fc6a2381d02fa44de78b58d6658d4c3b0dea523569ace0
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
4a027fe9f4a9        centos              "/bin/bash"         About a minute ago   Up About a minute                       mycentos
[root@docker01 ~]# docker exec -it mycentos /bin/bash
[root@4a027fe9f4a9 /]# ls data/
#新开一个终端创建文件
[root@docker01 ~]# cd /var/lib/docker/volumes/myvolume/_data/
[root@docker01 /var/lib/docker/volumes/myvolume/_data]# ls
[root@docker01 /var/lib/docker/volumes/myvolume/_data]# touch test.txt
#查看文件
[root@4a027fe9f4a9 /]# cd data/
[root@4a027fe9f4a9 data]# ls
test.txt
src:数据卷名字
dst:需要挂载的目录路径
注意:如果没有创建指定卷,则自动创建,默认创建的事是匿名的数据局。

此时开启另外一个终端再次创建一个容器,并且挂载同样的数据卷,可以发现这种方式可以在容器之间共享和重用

[root@docker01 ~]# docker run -itd --name mycentos01 --mount src=myvolume,dst=/data centos
75e190aeccd3031558afd83baa7a30160c596792304796a4210d94db4bb48769
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
75e190aeccd3        centos              "/bin/bash"         5 seconds ago       Up 4 seconds                            mycentos01
4a027fe9f4a9        centos              "/bin/bash"         2 hours ago         Up 2 hours                              mycentos
[root@docker01 ~]# docker exec -it mycentos01 /bin/bash
[root@75e190aeccd3 /]# ls data/         
test.txt

上面创建容器并挂载数据卷,还可以使用下面这种方法 -v 数据卷名字:挂载路径,Docker挂载数据卷默认权限是读写,也可以通过 :ro 指定为只读。

[root@docker01 ~]# docker run -itd --name mycentos02 -v myvolume:/test:ro centos
dbc735c7f5056603b534c95a776662d71e817196f89327ca892cbb4bc555fc2f
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
dbc735c7f505        centos              "/bin/bash"         9 seconds ago       Up 9 seconds                            mycentos02
75e190aeccd3        centos              "/bin/bash"         7 minutes ago       Up 7 minutes                            mycentos01
4a027fe9f4a9        centos              "/bin/bash"         2 hours ago         Up 2 hours                              mycentos
[root@docker01 ~]# docker exec -it dbc735c7f505 /bin/bash
[root@dbc735c7f505 /]# ls test/
test.txt

删除数据卷
Docker 不会在容器被删除后自动删除数据卷。且如果要删除数据卷,必须先将使用数据卷的容器停止,删除后,才能删除数据卷

[root@docker01 ~]# docker rm -f $(docker ps -qa)
dbc735c7f505
75e190aeccd3
4a027fe9f4a9
39b8b0ab96d4
716a492ee32a
[root@docker01 ~]# docker volume rm myvolume
myvolume

挂载一个主机目录作为数据卷
使用 -v 参数也可以指定挂载一个本地主机的目录到容器中

[root@docker01 ~]# docker run -itd --name web -v /webapp:/opt/webapp centos  #创建一个挂载本地目录的容器
becbfc3e81ea9280aefb3884b1b1fa45ff773086bb520aa0852bd95b5710f49f
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
becbfc3e81ea        centos              "/bin/bash"         6 seconds ago       Up 5 seconds                            web
[root@docker01 ~]# ls /webapp/  #本地没有会自动的创建
[root@docker01 ~]# echo "hello world" >/webapp/index.html #追加内容至文件
[root@docker01 ~]# ls /webapp/  #本地查看
index.html
[root@docker01 ~]# cat /webapp/index.html 
hello world
[root@docker01 ~]# docker exec -it becbfc3e81ea /bin/bash #进入容器内部查看
[root@becbfc3e81ea /]# cat /opt/webapp/index.html 
hello world

挂载一个宿主机文件作为数据卷

-v 参数也可以从主机挂载单个文件到容器中

root@docker01 ~]# echo "test" >test.txt
[root@docker01 ~]# docker run -itd --name web01 -v /root/test.txt:/opt/test.txt centos
d0b4b5347524171c8d214366ad17e0a3301209a0639e980b137969317c2b6b5e
[root@docker01 ~]# docker exec -it d0b4b5347524 /bin/bash
[root@d0b4b5347524 /]# cat /opt/test.txt 
test

数据卷容器
如果有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。

数据卷容器其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
--volumes-from (跟某一个已经存在的容器挂载相同的卷)

[root@docker01 ~]# docker run -d -v /dbdata --name dbdata centos #创建一个数据卷容器
64ae39622380535beb3ff76d0b922018f53bbf3dad74f4f46b092296df0849ef
[root@docker01 ~]# docker run -d -it --volumes-from dbdata --name db01 centos #创建一个容器db01使用--volumes-from挂载dbdata.
0646d45189469572482df94d8b8a177b2afa02b0f4d9cc83ad755010f98cb343
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0646d4518946        centos              "/bin/bash"         15 seconds ago      Up 14 seconds                           db01
[root@docker01 ~]# docker exec -it 0646d4518946 /bin/bash #登录容器内部查看
[root@0646d4518946 /]# ls
bin dev  home  lib64       media  opt   root  sbin  sys  usr
dbdata  etc  lib   lost+found  mnt    proc  run   srv   tmp  var
[root@0646d4518946 /]# touch dbdata/file1 #创建一个文件
[root@docker01 ~]# docker run -d -it --volumes-from dbdata --name db02 centos #创建第二个挂载数据卷容器的容器db02
f5c952b1dba0dc5578b1c2e703b3380565eecfda353d9583499d7749259dc5ce
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f5c952b1dba0        centos              "/bin/bash"         5 seconds ago       Up 4 seconds                            db02
0646d4518946        centos              "/bin/bash"         4 minutes ago       Up 4 minutes                            db01
[root@docker01 ~]# docker exec -it f5c952b1dba0 /bin/bash
[root@f5c952b1dba0 /]# ls dbdata/ #查看文件存在证明数据共享。
file1

从上面可以看出可以使用超过一个 --volumes-from 参数来指定从多个容器挂载相同的的数据卷,也可以从其他已经挂载了数据卷的容器来级联挂载数据卷,示例:

[root@docker01 ~]# docker run -itd --name db03 --volumes-from db01 centos
622211d51fdcf143d09fb0f1c760aeb9652bbb063acda3692dd01a14dae6e630
[root@docker01 ~]# docker exec -it 622211d51fdcf143 /bin/bash
[root@622211d51fdc /]# ls dbdata/
file1

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

Docker容器的网络

Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。
外部访问容器
容器中可以运行一些网络应用,比如(nginx,apache,php等),要让外部访问这些应用可以通过 -P 或者 -p 参数来制定端口映射

使用 -P 参数时,Docker 会随机映射一个 端口到内部容器开放的网络端口。

[root@docker01 ~]# docker run -d -P centos_nginxsrc:v4
db1eeff2a8071addb6e1dc449605f49371d3e4d1a1bb19aed101b7448a4f3c5a
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                   NAMES
db1eeff2a807        centos_nginxsrc:v4   "nginx -g 'daemon of…"   12 seconds ago      Up 11 seconds       0.0.0.0:32768->80/tcp   friendly_lichterman
[root@docker01 ~]# curl localhost:32768



Welcome to nginx!
...

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

ip:hostPort:containerPort     | ip::containerPort    | hostPort:containerPort

映射所有的接口的地址

# hostPort:containerPort#使用hostPort:containerPort 格式宿主机的88端口映射到容器的80端口,默认会绑定宿主机所有接口上的所有地址
[root@docker01 ~]# docker run -d -p 80:80 --name nginx01 centos_nginxsrc:v4
7f1d7713a0428af350ab86518574ab8fcdf57c9ca41b70fe395a9c9e4630b12c
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                NAMES
7f1d7713a042        centos_nginxsrc:v4   "nginx -g 'daemon of…"   6 seconds ago       Up 5 seconds        0.0.0.0:80->80/tcp   nginx01

映射到指定地址的指定端口

#ip:hostPort:containerPort#使用ip:hostPort:containerPort 格式指定映射使用一个特定地址,如localhost地址127.0.0.1
[root@docker01 ~]# docker run -d -p 127.0.0.1:81:80 --name nginx02 centos_nginxsrc:v4
6b890b75c42422bdd6d0ef9c37bef224df785fa8093376bc25cd28f3aa78cdd0
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED              STATUS              PORTS                  NAMES
6b890b75c424        centos_nginxsrc:v4   "nginx -g 'daemon of…"   5 seconds ago        Up 4 seconds        127.0.0.1:81->80/tcp   nginx02

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

#ip::containerPort #使用ip:containerPort 绑定localhost的任意端口到容器的80端口,宿主机会自动分配一个端口
[root@docker01 ~]# docker run -d -p 127.0.0.1::80 --naem nginx03 centos_nginxsrc:v4
85f70aee5540c087c9d28dda50f2c8f1b093ddac7b00379ac245861327639958
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                     NAMES
85f70aee5540        centos_nginxsrc:v4   "nginx -g 'daemon of…"   7 seconds ago       Up 5 seconds        127.0.0.1:32768->80/tcp   nginx03

指定udp端口

[root@docker01 ~]# docker run -d -p 127.0.0.1:82:80/udp --name nginx04 centos_nginxsrc:v4
2f178794f66c87ab8e5c77f5aaf73f2e9dfdfab2ed0d26a2aaa4f13a9cda733d
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                          NAMES
2f178794f66c        centos_nginxsrc:v4   "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds        80/tcp, 127.0.0.1:82->80/udp   nginx04

查看映射端口配置

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

[root@docker01 ~]# docker port nginx04
80/udp -> 127.0.0.1:82

注意:

容器有自己内部网络地址和ip地址(使用 docker inspect 可以获取所有变量,Docker 还可以有一个可变的网络配置)
-p 标记可以多次使用来绑定多个端口

[root@docker01 ~]# docker run -d -p 127.0.0.1:82:80 -p 8080:443 --name nginx05 centos_nginxsrc:v4
433436861a5a4fb46503cac5a76c206f278a262270be9e4135f8d27b6aacc239
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                         NAMES
433436861a5a        centos_nginxsrc:v4   "nginx -g 'daemon of…"   9 seconds ago       Up 8 seconds        127.0.0.1:82->80/tcp, 0.0.0.0:8080->443/tcp   nginx05

容器互联
容器的连接(linking)系统除了端口映射外,另一种是容器中应用交互的方式。该系统会在源和接收容器之间创建一个隧道,接受容器可以看到源容器指定的信息。
请参考docker网络配置:https://www.jianshu.com/writer#/notebooks/41877344/notes/58850036

你可能感兴趣的:(Docker基础操作)