概述

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

常用命令

列出所有的容器id

docker ps -l

保存一个容器版本

docker commit <continer_id> <name>

重命名容器

docker rename <container_name> <new_name>

重命名镜像

docker image tag <image_name[:latest]> <new_name[:latest]>
# 或者
docker image tag <image_id> <new_name[:latest]>

#以上操作会创建一个同镜像的镜像标签,然后需要删除旧镜像标签
docker rmi <image_name>

列出所有的容器版本

docker images

容器里运行一个命令

docker run <name> <comand> [options]

杀死所有正在运行的容器

docker kill $(docker ps -a -q)

删除所有已经停止的容器

docker rm $(docker ps -a -q)

删除所有镜像

docker rmi $(docker images -q)

查看docker 版本

docker version

搜索可用的docker镜像

docker search tutorial

下载镜像

docker pull learn/tutorial

创建镜像

cd /
tar -cjf image.tar.bz2 .

重新运行已停止的容器,并运行shell

docker start <NAME>/<ID>

docker exec -ti <NAME>/<ID> /bin/bash
#or
docker attach <CONTAINER ID>/<NAMES>

退出时如果想继续运行:按顺序按ctrl+p ctrl+q
如果不想继续运行:按ctrl+d或输入exit
如果关闭后重启请输入:docker restart <CONTAINER ID>/<NAME>

导入镜像

cat test.tar.bz2 | docker import - container_name:tag

运行命令 保存在记录列表里

docker run -ti --name 自定义名字 容器名 命令

将一个container固化为一个新的image(commit)

docker commit <container> [repo:tag]

GUI应用

运行firefox

docker run -ti --rm \
       -e DISPLAY=$DISPLAY \
       -v /tmp/.X11-unix:/tmp/.X11-unix \
       firefox

如果提示:0无法连接,可以在运行docker命令之前运行xhost +,解除x的访问限制

运行shell

docker run -i -t -v /home/tuser/public:/public <name> /bin/bash

运行360

    #!/bin/bash
    QT_X11_NO_MITSHM=1
    start360
docker run -ti --rm \
       -e DISPLAY=$DISPLAY \
       -v /tmp/.X11-unix:/tmp/.X11-unix \
       <container_name> sudo script.sh

运行wps

wps有一个现成的容器可以使用,由于我在系统里挂载了一些windows路径,所以启动文件修改了一下。

以excel为例

#!/bin/bash

FINALNAME=
BASENAME="/home/user/Documents"

COMMAND="et"
COMMAND_NAME="et"
IMAGE_NAME="zjzstu/wps:latest"

WIN_D="/mnt/d/"

IFS=$(echo -en "\n\b")
# 替换主机文件路径为容器路径
function parse_arg()
{
  FILE_DIR=$1

  if [[ ${FILE_DIR} == ./* ]];then
    FINALNAME=${PWD}${FILE_DIR#.}

    FINALNAME=${BASENAME}${FINALNAME#${HOME}}
  elif [[ ${FILE_DIR} == ../* ]];then
    FINALNAME=`dirname ${PWD}`${FILE_DIR#..}
    FINALNAME=${BASENAME}${FINALNAME#${HOME}}
  elif [[ ${FILE_DIR} == ${HOME}* ]];then
    FINALNAME=${FILE_DIR}
    FINALNAME=${BASENAME}${FINALNAME#${HOME}}
  elif [[ ${FILE_DIR} == ${WIN_D}* ]];then
    FINALNAME="/home/user/d/"${FILE_DIR#${WIN_D}}
  else
    FINALNAME=${PWD}/${FILE_DIR}
    FINALNAME=${BASENAME}${FINALNAME#${HOME}}
  fi

    # FINALNAME=${BASENAME}${FINALNAME#${HOME}}
  }

# 启动wps镜像
function startup()
{
  docker run -d \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e DISPLAY=unix${DISPLAY} \
    -e LOCAL_USER_ID=`id -u ${USER}` \
    -e XMODIFIERS="@im=fcitx" \
    -e QT_IM_MODULE="fcitx" \
    -e GTK_IM_MODULE="fcitx" \
    -v ${HOME}:${BASENAME} \
    -v "/mnt/d":"/home/user/d/" \
    --name ${COMMAND_NAME} \
    ${IMAGE_NAME} \
    ${COMMAND} ${FINALNAME} > /dev/null 2>&1
  }

function run()
{
  xhost + > /dev/null 2>&1

  START=$(docker ps -q --filter="name=${COMMAND_NAME}")
  STOP=$(docker ps -aq --filter="name=${COMMAND_NAME}")

  if [ -n "${START}" ]
  then
    docker exec -u user $START ${COMMAND} $FINALNAME > /dev/null 2>&1
  elif [ -n "${STOP}" ]
  then
    if [ -z ${FINALNAME} ]
    then
      docker restart ${STOP} > /dev/null 2>&1
    else
      docker container rm ${STOP} > /dev/null 2>&1
      startup
    fi
  else
    startup
  fi
}

function main()
{
  NUM=$#
  if [ $NUM -eq 1 ]
  then
    parse_arg "$@"
  fi

  run "$@"
  exit 0
}

main "$@"

容器

使用说明

后台运行

先创建并进入一个新的被命名为newos的新容器

docker run -it --name newos docker.io/centos   

创建并指定端口号映射

docker run -d -p 8002:80 --name my_ng nginx/centos /bin/bash

启动的时候用/bin/bash可能到时下一次无法启动 可以改成tail -f /var/log/nginx/error.log等前台运行的命令

docker run -it -p 8001:80 --name nginx01 -h nginx ng1 /bin/bash

不用-d参数 也不能直接nginx把ng启动在后台 这样都没法启动容器 用/bin/bash先进入在ctrl p d 放在后台

Ctrl + P + Q退出容器保持后台运行(按住ctrl和P 再按Q),再用 docker ps 进行查看: exit可以直接退出容器

再次进入一个正在运行的容器

docker attach dreamy_ritchie或者用ID

还有更好的,上面的attach经常会卡主不动

docker exec -it <ContainerName> /bin/bash
# 上面用attach进入的用exit会退出容器必须用ctrl P Q退出才能继续后台运行,exec的 用exit也不会真正退出容器继续后台运行  用name或id都可以

docker exec -it <ContainerName> Command
# 是执行完命令就退出放在后台比如 ps -ef 显示内容然后就退出前台  如果要进入容器就用/bin/bash

前提是容器要正在运行 如果不是running就先docker start <ContainerName>

后台运行

以root权限运行shell命令

docker exec -it --user root <container id> /bin/bash

参考链接

相关链接

Dockerfile介绍
http://blog.tankywoo.com/docker/2014/05/08/docker-2-dockerfile.html

http://www.21ops.com/linux/13512.html

运行GUI程序
http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/
http://www.csdn.net/article/2015-07-30/2825340

在debian9上安装docker
https://www.cnblogs.com/heyangyi/p/8613149.html