docker-基本使用

安装

问题:connect: permission denied
当前用户添加到docker属组即可

sudo groupadd docker
sudo gpasswd -a ${USER} docker
// 重启 docker 服务
sudo service docker restart
// 切换当前会话到新 group 或者重启 X 会话
newgrp - docker

基本信息

Docker 是服务器—-客户端架构
本机需要有服务运行,如果没有运行使用下面命令启动

# service 命令的用法
$ sudo service docker start

# systemctl 命令的用法
$ sudo systemctl start docker

container 本身也是个文件,停止运行不会删除,

# 列出本机正在运行的容器
$ docker ps

# 列出本机所有容器,包括终止运行的容器
$ docker ps -a

删除
$ docker container rm [containerID]

查看容器信息

docker inspect containerID

mac 下的保存路径
/Users/{YourUserName}/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
可以使用软连接放到别的地方

mv ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/ /otherPath/com.docker.driver.amd64-linux
ln -s /otherPath/com.docker.driver.amd64-linux /Users/<username>/Library/Containers/com.docker.docker/Data

操作实例

下载 ubuntu 16.04 的 image
docker hub 找到 ubuntu 官方镜像,下面是支持的 tag
Supported tags and respective Dockerfile links
18.04, bionic-20180724.1, bionic, latest, rolling (bionic/Dockerfile)
18.10, cosmic-20180725, cosmic, devel (cosmic/Dockerfile)
14.04, trusty-20180712, trusty (trusty/Dockerfile)
16.04, xenial-20180726, xenial (xenial/Dockerfile)
还可以通过 docker search 镜像名 来获取

docker pull ubuntu:16.04
-it交互方式启动容器,-name 给容器命名 -v目录映射 '宿主目录:容器目录',--net=host指定网络端口映射方式为映射主机所有网络端口到容器内部。938 为镜像 ID 的头2位,只要可以区分即可。
docker run -it --name ubuntu16.04 -v /Users/zhengjun/project/docker/ubuntu16.04:/home/data --net=bridge 938 /bin/bash
-p指定端口映射,前者为主机端口,后者为容器端口
docker run -it -d --name ubuntu_test -p 8088:80 ubuntu

看日志

$ docker logs [OPTIONS] CONTAINER
Options:
--details 显示更多的信息
-f, --follow 跟踪实时日志
--since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
--tail string 从日志末尾显示多少行日志, 默认是all
-t, --timestamps 显示时间戳
--until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

配置镜像源

国内访问 Docker 的官方仓库很慢,还经常断线,所以要把仓库网址改成国内的镜像站
网页一直打不开,稍后在处理吧

查看版本

docker version
docker info

查看容器的 IP 地址

docker inspect <container id>

移除未使用的数据

docker system prune [OPTIONS]
--all , -a Remove all unused images not just dangling ones
--filter API 1.28+
Provide filter values (e.g. ‘label==')
--force , -f Do not prompt for confirmation
--volumes Prune volumes

image 操作

  1. 查看 image
    docker images
  2. 删除 image
    可以同时删除多个 img1 ,img2
    docker rmi img1 img2
  3. 删除所有 images
    docker rmi $(docker images -q)
  4. 下载 image
    docker pull image-name:image-tag

容器操作

  • 查看容器

    docker ps
    // 包括未运行的容器
    docker ps -all

    ps 参数说明:

  • a :显示所有的容器,包括未运行的。

  • f :根据条件过滤显示的内容。

  • -format :指定返回值的模板文件。

  • l :显示最近创建的容器。

  • n :列出最近创建的n个容器。

  • -no-trunc :不截断输出。

  • q :静默模式,只显示容器编号。

  • s :显示总的文件大小。

  • 停止容器

    docker stop container-name/id
  • 重新运行容器

    docker start container-name/id
  • 删除容器

    docker rm container-id
  • 删除所有容器

    docker rm $(docker ps -a -q)
  • 容器日志

    docker logs container-name / container-id
  • 登录容器
    运行中的容器其实是一个功能完备的 Linux 操作系统,所以我们可以像常规的系统一样登录并访问容器。
    我们可以使用下面命令,登录访问当前容器,登录后我们可以在容器中进行常规的 Linux 系统操作命令,还可以使用 exit 命令退出登录
    下面命令解决 bash 宽度没变化的问题

    docker exec -e COLUMNS="`tput cols`" -e LINES="`tput lines`" -it container-id/name bash
  • 从容器创建 image

    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    -a :提交的镜像作者;
    -c :使用Dockerfile指令来创建镜像;
    -m :提交时的说明文字;
    -p :在commit时,将容器暂停。

    样例:

    docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1

创建并运行一个容器

最简单的命令,不能交互

docker run --name container-id -d image-name
# 例如:
docker run --name test-redis -d redis

添加 it 参数,支持交互

docker run -it --rm ubuntu /bin/bash
38baf226.png

参数:
-p: 端口映射,格式为:主机(宿主)端口:容器端口
–net=”bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
–expose=[]: 开放一个端口或一组端口;
-d:后台运行

docker run -d -p 6378:6379 --name port-redis redis

宿主相关操作

  • 获取容器 ip
    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container-id/name

docker容器中切换用户

docker容器中切换用户,提示权限不足:

// 启动容器是使用特权启动:
docker run -it --privileged -v /home/dora:/home/dora centos_ora /bin/bash

制作 image

通过 docker commit 制作镜像

是往版本控制系统里提交一次变更。使用这种方式制作镜像,本质上是运行一个基础镜像,然后在基础镜像上进行软件安装和修改。最后再将改动提交到版本系统中。
这个不推荐了,无法看到具体添加的东西,修改也不方便,使用 docker file 更好些

通过 docker build 制作镜像

使用 docker build 创建镜像需要编写 Dockerfile.
编写自己的 Dcokerfile
运行 docker build 命令打包镜像

docker build [OPTIONS] PATH | URL | -
// 可以指定多个 tag
docker build --no-cache -t digitalcoin:bitcoin -t digitalcoin:latest .

遇到的问题

  1. docker制作镜像 apt-get 安装文件报错debconf: unable to initialize frontend: Dialog
    解决方法,添加下面设置
    ARG DEBIAN_FRONTEND=noninteractive

docker files

项目目录下 .dockerignore 写入需要忽略的文件和目录

.git
node_modules
npm-debug.log
  • ARG
    仅在编译时有效

  • 参考样例

# docker file for bitcoin/primecoin test node and compile environment 2018.08.09
FROM ubuntu:16.04

MAINTAINER Tyler Cheng - "<zhengjun2018@gmail.com>"

ARG DEBIAN_FRONTEND=noninteractive

# modify to custom china source
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

RUN apt-get update && apt-get install -y --no-install-recommends apt-utils && apt-get upgrade -y
# net-tools:ifconfig,iputils-ping:ping
RUN apt-get install -y net-tools iputils-ping \
autoconf libtool pkg-config libboost-all-dev libssl-dev libevent-dev software-properties-common
RUN add-apt-repository ppa:bitcoin/bitcoin
RUN apt-get update && apt-get install -y libdb4.8-dev libdb4.8++-dev libminiupnpc-dev

分享你的镜像

以Docker ID登录

docker login

标记镜像

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
docker tag firstimage YOUR_DOCKERHUB_NAME/firstimage

去掉标记

docker rmi repository:tag

发布镜像

docker push username/repository:tag
docker push YOUR_DOCKERHUB_NAME/firstimage

卸载 docker

在实际使用中,发现还是有些不顺畅的地方,经常卡顿,不知道是不是和资源有关

先删除镜像和容器

查看装了哪些包
dpkg -l | grep -i docker
根据安装的包卸载,下面命令中没有的去掉
sudo apt-get purge -y docker-engine docker docker.io docker-ce
sudo apt-get autoremove -y --purge docker-engine docker docker.io docker-ce
删除剩余项目
sudo rm -rf /var/lib/docker
sudo rm /etc/apparmor.d/docker
sudo groupdel docker
sudo rm -rf /var/run/docker.sock