docker笔记

  1. 最近项目使用的docker作为生产环境,从最早对docker完全陌生到现在基本熟练还是需要一些实践过程的。最早通过百度了解到docker有镜像、容器这两个重要的概念。及镜像就相当于一个制作好的Ghost镜像,容器就是这个Ghost恢复的系统。但docker有自己的优势,更多好用的功能可以自行百度。这里我只记录一些使用过程中积累的好的笔记。
  2. 在我的ubuntu上安装和卸载docker,国内快速安装过程(实在解决不了的问题只能重装docker了)
curl -sSL https://get.daocloud.io/docker | bash
curl -fsSL https://get.docker.com/gpg | sudo apt-key add -
卸载docker
sudo apt-get purge docker-engine
sudo apt-get autoremove --purge docker-engine
rm -rf /var/lib/docker
  1. 一些常用的命令,如下所示
docker images  ,查看docker的镜像
docker ps      ,查看docker正在运行的容器
docker ps -qf name=xxx   ,查看容器名为xxx*的结果
docker pull ubuntu:16.04 ,从[docker商店][1]中获取别人的docker镜像
//下面两个命令相对应,直接备份容器到文件
docker export 7691a814370e > my_container.tar ,直接备份容器到文件
cat my_container.tar | docker import - image_name:latest  ,恢复文件为镜像
//下面三个命令相对应,先备份容器为镜像,再备份镜像为文件,对比上面的备份恢复,可以备份docker操作过程的层级
docker commit -p 30b8f18f20b4 container-backup  ,将一个容器提交为镜像
docker save -o ubuntu_14.04.tar ubuntu:14.04  ,保存镜像为文件
docker load --input ubuntu_14.04.tar  ,将文件恢复为镜像
docker exec -it xxx /bin/bash  ,进入docker容器的后台
docker exec xxx ps -auxf    ,在宿主机中执行容器后台命令ps -auxf
  1. 在docker使用过程中需要注意的地方
    1.创建容器时需要确定好共享文件和端口,因为一旦使用过程中需要共享路径和端口会很麻烦

甚至无法做到。一般要共享/etc/localtime文件,保证容器和宿主机的时间一致
2.当不想和宿主机共用一个IP时可以将宿主机网卡设置为桥接模式,安装如下软件并配置好网络
apt-get install bridge-utils (安装桥接工具)

auto br0
iface br0 inet static
address 10.19.52.10
netmask 255.255.0.0
gateway 10.19.0.254
bridge_ports ens18
bridge_stp off
dns-nameservers 114.114.114.114

这时需要用下面的脚本来为容器设备单独的IP地址,这样就不用为容器共享端口了(注意共享路径貌似没法新增和删除咯)

#/bin/bash
if [ -z $1 ] || [ -z $2 ] || [ -z $3 ] || [ -z $4 ];
then
  echo "*****Input the necessary parameters: CONTAINER_NAME IP MASK GATEWAY"
  echo "*****Call the script like: sh docker_static_ip.sh  shiwei 172.16.10.123 24 172.16.10.1"
  exit
fi
  
CONTAINER_NAME=$1
SETIP=$2
SETMASK=$3
GATEWAY=$4
ETHNAME="eth_"$1
 
#判断宿主机网卡是否存在
ifconfig $ETHNAME > /dev/null 2>&1
if [ $? -eq 0 ]; then
  read -p "$ETHNAME exist,do you want delelte it? y/n " del
  if [ $del == 'y' ]; then
    ip link del $ETHNAME
  else
  exit
  fi
fi
#
pid=`docker inspect -f '{{.State.Pid}}' $CONTAINER_NAME`
mkdir -p /var/run/netns
find -L /var/run/netns -type l -delete
 
if [ -f /var/run/netns/$pid ]; then
    rm -f /var/run/netns/$pid
fi
    rm -f /var/run/netns/$pid
ln -s /proc/$pid/ns/net /var/run/netns/$pid
#
ip link add $ETHNAME type veth peer name B
brctl addif br0 $ETHNAME
ip link set $ETHNAME up
ip link set B netns $pid
#先删除容器内已存在的$ETHNAME
ip netns exec $pid ip link del $ETHNAME > /dev/null 2>&1
#设置容器新的网卡$ETHNAME
ip netns exec $pid ip link set dev B name $ETHNAME
ip netns exec $pid ip link set $ETHNAME up
ip netns exec $pid ip addr add $SETIP/$SETMASK dev $ETHNAME
ip netns exec $pid ip route add default via $GATEWAY

captcha