docker入门教程-安装及使用

安装

官方文档

Docker提供了以下Linux发行版和体系结构中的.deb和.rpm软件包:

docker linux

这里我们以centos为例(新版Docker已不支持centos 7以下的版本,所以centos 6.x 慎用):

  • 卸载旧版

    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  • 设置仓库

    # 安装需要的工具
    sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2
    # 设置docker仓库
    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    
  • 安装docker

    sudo yum install docker-ce docker-ce-cli containerd.io
    

Docker的使用

Docker技术的核心是imagecontainernetworkvolume

旧版的docker客户端的命令一般是 docker command的方式的,新版的Docker为了更好的区分不同模块的命令,可以支持类似docker image ls这样的命令(docker module command)。

Docker 镜像(image

镜像是创建容器的只读模板

指令 描述
ls 列出镜像
build 构建镜像来自Dockerfile
history 查看镜像历史
inspect 显示一个或多个镜像详细信息
pull 从镜像仓库拉取镜像
push 推送一个镜像到镜像仓库
rm 移除一个或多个镜像
prune 移除未使用的镜像。没有被标记或被任何容器引用的。
tag 创建一个引用源镜像标记目标镜像
export 导出容器文件系统到tar归档文件
import 导入容器文件系统tar归档文件创建镜像
save 保存一个或多个镜像到一个tar归档文件
load 加载镜像来自tar归档或标准输入
[root@cloudfile ~]# docker image -h
Flag shorthand -h has been deprecated, please use --help

Usage:  docker image COMMAND

Manage images

Commands:
  build       Build an image from a Dockerfile
  history     Show the history of an image
  import      Import the contents from a tarball to create a filesystem image
  inspect     Display detailed information on one or more images
  load        Load an image from a tar archive or STDIN
  ls          List images
  prune       Remove unused images
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rm          Remove one or more images
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

Run 'docker image COMMAND --help' for more information on a command.
[root@cloudfile ~]# 

示例:拉取nginx镜像

[root@cloudfile ~]# docker image ls #查看本地已有的镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
postgres            9.6                 6782500d4eb1        2 weeks ago         200MB
kong                latest              7a800e1cef72        3 weeks ago         185MB
[root@cloudfile ~]# docker pull nginx    # 可以省略images, 默认拉取最新版本,指定版本可以在镜像名后面添加版本号,例如 docker pull nginx:1.14
Using default tag: latest
latest: Pulling from library/nginx
afb6ec6fdc1c: Pull complete 
b90c53a0b692: Pull complete 
11fa52a0fdc0: Pull complete 
Digest: sha256:6fff55753e3b34e36e24e37039ee9eae1fe38a6420d8ae16ef37c92d1eb26699
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
You have new mail in /var/spool/mail/root
[root@cloudfile ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
postgres            9.6                 6782500d4eb1        2 weeks ago         200MB
nginx               latest              9beeba249f3e        2 weeks ago         127MB
kong                latest              7a800e1cef72        3 weeks ago         185MB
[root@cloudfile ~]# 

Docker 容器(container

创建容器

Docker 使用 run+image name 命令来创建容器,创建一个容器的时候可以附加许多指令来设置很多条件

设置相关指令
指令 描述
-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 netwokname 连接容器到一个网络
--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周期的更大或更小比例
示例:创建一个nginx容器
docker run -tid --name dev-nginx -p 8080:80 nginx
-tid 这里使用了指令连写的方式,使用了t i d这三个指令 表示是交互式的、分配伪终端、运行容器到后台,
--name 将这个容器命名为dev-nginx
-p 8080:80 是将宿主机的8080端口转发到容器的80端口
[root@cloudfile ~]# docker ps #查看运行中的进程
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@cloudfile ~]# docker run -tid --name dev-nginx -p 8080:80 nginx # 创建dev-nginx容器
e0b8a178c45918bb9b0da9fc696690eb99cdb24db4b008381e8a2b1d959fbbf0 #docker引擎分配的容器id
[root@cloudfile ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
e0b8a178c459        nginx               "nginx -g 'daemon of…"   2 seconds ago       Up 2 seconds        0.0.0.0:8080->80/tcp   dev-nginx
[root@cloudfile ~]# 

使用容器

容器创建成功之后,我们就有许多其他的命令可以用来操作这个容器了。

指令 描述
ls 列出容器
inspect 显示一个或多个容器详细信息
attach 附加本地标准输入,输出和错误到一个运行的容器
exec 在运行容器中执行命令
commit 创建一个新镜像来自一个容器
cp 拷贝文件/文件夹到一个容器
logs 获取一个容器日志
port 列出或指定容器端口映射
stats 显示容器资源使用统计
top 显示一个容器运行的进程
update 更新一个或多个容器配置
stop/start 停止/启动一个或多个容器
rm 删除一个或多个容器

容器启动成功之后,Docker引擎会自动分配一个containerId,这个id可以用来唯一标识这个容器,也可以使用通过--name来命名容器作为唯一标识。我们可以使用docker stop/start/rm ... containerName/prefix4(containerId)格式来操作容器,其中containerName是容器名称,prefix4(containerId)为containerId至少前4位。

[root@cloudfile ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
e0b8a178c459        nginx               "nginx -g 'daemon of…"   2 hours ago         Up 2 hours          0.0.0.0:8080->80/tcp   dev-nginx
[root@cloudfile ~]# docker stop dev-nginx   # 停止dev-nginx
dev-nginx
[root@cloudfile ~]# docker rm dev-nginx     # 删除dev-nginx
dev-nginx
[root@cloudfile ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@cloudfile ~]#
  • 进入容器

    docker exec -it containerId/containerName bash
    

    退出容器的终端 control+p+q

  • 查看容器日志

    docker log containerId/containerName
    
  • 自动重启

    加上 `--restart=always`
    

Docker 网络(network)

Docker 支持自定义network来提供给容器进行通讯,Docker 内置了一个默认的bridge network,有未指定 network 的容器,默认连接到此 network 中,其网段为 172.17.0.1/16。所以,两个未进行任何连接操作的容器是可以通过 IP 地址互相通信的,因为他们同在一个 network 下,但通讯只能通过 IP 地址进行(比如 ping 172.17.0.5),不可以通过容器名通信(比如 ping container-name)。但自定义创建的网络可以通过容器名进行通信。

[root@cloudfile ~]# docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.
[root@cloudfile ~]# 

可以通过 docker network connect 指令将容器连接到一个 network,也可以在起容器(docker run 指令)时加入 --network 参数指定即将创建的容器加入到哪个 network,还可以通过 docker network disconnect 命令将容器移出自定义的 network。

示例:创建容器连接网络

[root@cloudfile ~]# docker network list # 查看网络节点列表
NETWORK ID          NAME                DRIVER              SCOPE
b0b2ac02a44e        bridge              bridge              local
e6b334287fd0        host                host                local
73cc4dd0610d        none                null                local
[root@cloudfile ~]# docker network create dev # 添加名为dev的列表
570b83327e2b3cfa53922a1b5f5c223d6f6166ace7069648fb0188295a6d6922
[root@cloudfile ~]# docker network list
NETWORK ID          NAME                DRIVER              SCOPE
b0b2ac02a44e        bridge              bridge              local
570b83327e2b        dev                 bridge              local
e6b334287fd0        host                host                local
73cc4dd0610d        none                null                local  
# 创建容器时指定网络
[root@cloudfile ~]# docker run -tid --name dev-nginx-01 -p 8080:80 --network=dev nginx 
82c81a5d7ab07a2233e5dc4b74300c661aaef67de7ec7cee98be388c981dfa41
# 先创建容器
[root@cloudfile ~]# docker run -tid --name dev-nginx-02 -p 8081:80 nginx
0408d5b0f61d31d33751512014072d240b5ad25cb05aae57e4aac97071983e2f 
# 将容器连接至dev网络
[root@cloudfile ~]# docker network connect dev dev-nginx-02 
[root@cloudfile ~]# 

Docker 卷(volume)

Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs。

  • volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。
  • bind mounts:可以存储在宿主机系统的任意位置。
  • tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统。
Docker 数据管理

卷 Volume

当我们创建一个容器的时候,如果没有指定卷,会自动创建一个圈以供容器存储数据,docker的卷默认存储的位置在/var/lib/docker/volumes下,我们可以创建一个volume在创建容器的时候绑定,这样能更加方便的管理容器的数据,不过比起mount来说,mount会更加通用一些。

[root@cloudfile ~]# docker volume --help

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.
[root@cloudfile ~]# 
管理卷
  • 查看volume

    [root@cloudfile volumes]# docker volume list
    DRIVER              VOLUME NAME
    local               c4969d2e6be2f8ffedd12bdb983d6xxxx
    
  • 创建volume

    [root@cloudfile volumes]# docker volume create nginx-volume
    nginx-volume
    [root@cloudfile volumes]# docker volume list
    DRIVER              VOLUME NAME
    local               c4969d2e6be2f8ffedd12bdb983d6xxxx
    local               nginx-volume
    [root@cloudfile volumes]# 
    
  • 查看volume详情

    [root@cloudfile volumes]# docker volume inspect nginx-volume
    [
        {
            "CreatedAt": "2020-06-01T16:07:20+08:00",
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data",
            "Name": "nginx-volume",
            "Options": {},
            "Scope": "local"
        }
    ] 
    [root@cloudfile volumes]# 
    
  • 删除volume

    docker volume rm nginx-volume
    
指定volume创建容器

两种写法:

  • docker run -itd --name=nginx-dev --mount src=nginx-volume,dst=/usr/share/nginx/html nginx
  • docker run -itd --name=nginx-dev -v nginx-vol:/usr/share/nginx/html nginx

通过上述命令启动容器之后,我们可以看到/var/lib/docker/volumes/nginx-volume/_data生成了些nginx的默认文件,这个时候我们就可以将我们的静态网页放置在这里了。

[root@cloudfile _data]# pwd
/var/lib/docker/volumes/nginx-volume/_data
[root@cloudfile _data]# ls
50x.html  index.html
[root@cloudfile _data]# 

绑定volume的好处不言而喻,多个容器可以共享一个数据卷 比如多个nginx 指定一个html文件夹 这样可以提供高可用。

Bind Mounts

我们知道了可以创建volume,然后绑定到容器中,可以达到数据管理以及数据卷共享的功能。但是为了更加方便管理,我们可以将已有的文件夹绑定到容器中。

  • docker run -d -it --name=nginx-dev --mount type=bind,src=/var/www,dst=/usr/share/nginx/html nginx
  • docker run -d -it --name=nginx-dev -v /var/www:/usr/share/nginx/html nginx

注意:

  • 如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
  • 如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。

你可能感兴趣的:(docker入门教程-安装及使用)