分类: Docker
Docker学习笔记一:docker基础

Docker 是什么?
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

docker-facebook.png
Docker 的用途
Docker 的主要用途,目前有三大类。

(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

Docker的优点
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
容器是进程级别的,相比虚拟机有很多优势。

(1)启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。

(2)资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。

(3)体积小
容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
docker安装:

yum install docker -y

启动docker:

systemctl start docker

加入开启启动:

systemctl enable docker

建立 docker 组:

groupadd docker

将当前用户加入docker组

usermod -aG docker $USER

添加内核参数:

tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

重新加载

sysctl -p

重新启动服务

systemctl daemon-reload
systemctl restart docker

加入国内镜像

/etc/docker/daemon.json文件中加入
{
 "registry-mirrors": ["https://registry.docker-cn.com"]
}

加入完以后,重启docker服务,使用docker info 命令查看是否生效

修改docker镜像和容器保存路径
在/etc/sysconfig/docker文件中加入下内容

OPTIONS=--graph="/data/docker"
或者

DOCKER_OPTS="-g /data/docker"
重启docker服务生效
运行docker run hello-world查看是否安装成功:

[root@cops163 docker]# docker run hello-world
Unable to find image 'hello-world:latest' locally
Trying to pull repository docker.io/library/hello-world ... 
latest: Pulling from docker.io/library/hello-world
ca4f61b1923c: Pull complete 
Digest: sha256:97ce6fa4b6cdc0790cda65fe7290b74cfebd9fa0c9b8c38e979330d547d22ce1
Status: Downloaded newer image for docker.io/hello-world:latest

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://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

获取镜像
从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker pull --help

Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
获取官方ubuntu 16.04镜像

docker pull ubuntu:16.04
运行ubuntu:16.04

docker run -it --rm ubuntu:16.04
docker运行:

docker run 就是运行容器的命令
参数:
-it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
--rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
ubuntu:16.04:这是指用 ubuntu:16.04 镜像为基础来启动容器。
bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。

列出镜像

docker image ls

镜像体积

docker system df

由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image)
虚悬镜像

docker image ls -f dangling=true

中间层镜像
为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker image ls 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数。

docker image ls -a

特殊显示
以表格等距显示,并且有标题行,和默认一样,自定义列:

docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"

只包含镜像ID和仓库名

docker image ls --format "{{.ID}}: {{.Repository}}"

只显示镜像ID

docker image ls -q

显示已经安装镜像的详细内容

docker images --no-trunc 

显示所有退出状态为1的容器

docker ps -a --filter &quot;exited=1&quot;

显示指定容器的IP

docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${CID}
docker ps :列出当前所有正在运行的container
docker ps -l :列出最近一次启动的container
docker ps -a :列出所有的container(包含历史,即运行过的container)
docker ps -q :列出最近一次运行的container ID
docker ps | grep wildfly | awk '{print $1}' 通过正则表达式查找容器的镜像ID

进入容器

docker attach ${CID} 

进入容器打开一个shell

docker exec -it ${CID} bash

停止指定容器

docker stop ${CID}

停止所有正在运行的容器

docker kill $(docker ps -a -q)

删除本地镜像

docker image rm 命令,其格式为:
docker image rm [选项] <镜像1> [<镜像2> ...]
用 ID、镜像名、摘要删除镜像
其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要。
用 docker image ls 命令来配合
像其它可以承接多个实体的命令一样,可以使用 docker image ls -q 来配合使用 docker image rm,这样可以成批的删除希望删除的镜像。

删除所有仓库名为 redis 的镜像:

docker image rm $(docker image ls -q redis)

删除所有在 mongo:3.2 之前的镜像:

docker image rm $(docker image ls -q -f before=mongo:3.2)

充分利用你的想象力和 Linux 命令行的强大,你可以完成很多非常赞的功能。
删除所有虚悬镜像

docker rmi $(docker images -q -f dangling=true)

使用正则表达式删除容器

docker ps -a | grep wildfly | awk '{print $1}' | xargs docker rm -f

删除docker容器

docker rm xxxx 删除容器 -f 删除运行中的
docker rm $(docker ps -a -q) 删除所有终止的容器

查找镜像

docker search redis

安装redis

docker pull redis:4.0.8

运行redis容器

docker run -p 6379:6379 -d redis:4.0.8 redis-server --appendonly yes


相关博文:

发表新评论