Ubuntu16.04安装docker+基本命令
1、安装docker
【安装】
[root]# apt-get install linux-image-extra-$(uname -r) #安装linux-image-extra
[root]# apt-get install docker.io #安装docker.io
[root]# service docker start|status|restart|stop
【更新+卸载】
[root]# apt-get upgrade docker-engine #更新
[root]# apt-get purge docker-engine #卸载
2、搜索仓库镜像
[root]# docker search ubuntu16.04 #查询仓库
[root]# docker images #查询本地
3、镜像添加标签
[root]# docker tag ubuntu:14.04 10.0.0.47:5000/registry #类似添加软连接
4、查询容器
[root]# docker ps (运行中)
[root]# docker ps -a (所有)
5、创建Docker用户组(不需要使用root用户就可以操作)
[root]# usermod -aG docker linuxidc
6、容器中安装新的程序
[root]# apt-get install -y ping #在docker中安装应用
[root]# docker run ubuntu apt-get install -y dialog #往docker里安装dialog
7、容器导入导出
【export/import】
[root]# docker export cbe3cb7799ed > update.tar #将容器导出到文件
[root]# docker import - ubuntu:updatev2 < update.tar #导入备份的容器
【save/load】
[root]# docker save -o update1.tar update #将update镜像导出到文件
[root]# docker rmi update # 删除update镜像
[root]# docker load < update1.tar #导入备份的镜像
8、创建本地仓库
docker pull registry
docker run -d -p 5000:5000 -v /home/docker/registry:/tmp/registry registry #-v 指定路径 获取registry镜像 搭建私有仓库
curl http://127.0.0.1:5000/v2 #验证仓库地址,有json返回就行
docker push ubuntu #上传镜像到本地仓库
docker pull bysir/helloword #本地仓库下载镜像
curl http://127.0.0.1:5000/v2/_catalog #查询仓库镜像
curl http://127.0.0.1:5000/v2/镜像名/tags/list
9、制作镜像
[root]# apt install debootstrap #安装 Debootstrap
[root]# mkdir -p /opt/new_os #Debootstrap构建Ubuntu16.04LTS的rootfs,rootfs存放在/opt/new_os
[root]# debootstrap --verbose --arch=amd64 xenial /opt/new_os http://10.31.48.30/ubuntu #构建基础 Ubuntu 16.04 LTS 的 rootfs
[root]# chroot /opt/new_os /bin/bash #切换到新rootfs,配置基础系统参数
[root]# apt -y update && apt -y upgrade && apt -y install vim locales #安装基础包
[root]# dpkg-reconfigure locales #配置系统字符集
[root]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #配置时区
可选:配置第三方衍生系统版本信息(如:UbuntuKylin)
[root]# tee /etc/ubuntukylin-release <<-‘EOF'
DISTRIB_ID=Ubuntu Kylin
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu Kylin 16.04"
EOF
[root]# rm -Rf /tmp/* && apt clean #清理系统
[root]# exit #退出当前 rootfs
[root]# tar -C /opt/new_os/ -c . | sudo docker import - new_os #打包并创建 Docker 镜像
[root]# docker run new_os cat /etc/lsb-release #测试镜像
发布到仓库
[root]# docker login shibingli@yeah.net
[root]# docker tag new_os shibingli/new_os
[root]# docker push shibingli/new_os #编辑/etc/docker/daemon.json 添加{"insecure-registry":["127.0.0.1:5000"]}
【当前的系统环境打包为容器基础镜像(很大,不建议)】
[root]# tar --numeric-owner --exclude=/proc --exclude=/sys -cvf new_os.tar /
[root]# cat new_os.tar | docker import - new_os
或
[root]# tar --numeric-owner --exclude=/proc --exclude=/sys -C / -c . | sudo docker import - new_os
10、修改已有镜像(修改后保存为新镜像)
[root]# docker run -t -i ubuntu:latest /bin/bash #启动容器
[root]# apt-get install -y ssh #在容器中安装应用应用
[root]# exit #使用 docker commit 命令来提交更新后的副本
[root]# docker commit -m "Added ssh" 0b2616b0e5a8 ubuntu:v2
-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息
[root]# docker diff 812a997f614a #对比和原镜像之间的差异
[root]# docker run -it ubuntu:v2 /bin/bash #使用新的镜像来启动容器
11、ssh
[root]# mkdir -p /var/run/sshd
[root]# /usr/sbin/sshd -D &
[root]# passwd root
[root]# sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
[root]# PermitRootLogin yes #修改 vi /etc/ssh/sshd_config
[root]# cd /
[root]# vi run.sh
/usr/sbin/sshd -D
[root]# chmod +x run.sh
[root]# exit
[root]# docker commit -m "Added ssh" 0b2616b0e5a8 ubuntu-ssh:v2
12、重建docker网络
解决方案:
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
重启docker后解决
13、Nvidia-docker
**Ubuntu distributions (Install nvidia-docker and nvidia-docker-plugin)**
# wget -P /mnt/yita_install/driver/NVIDIA/GeForce https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
# dpkg -i /mnt/yita_install/driver/NVIDIA/GeForce/nvidia-docker*.deb
启动nvidia-docker服务:
# systemctl start nvidia-docker #运行docker
# systemctl enable nvidia-docker #加入开机启动
# systemctl status nvidia-docker #查看状态
14、自定义网络(固话ip)
检查预置网络:
命令:docker network ls
自建网络:
主机1:docker network create --subnet=172.18.1.0/24 cinet
主机2:docker network create --subnet=172.18.0.0/24 cinet
关闭防火墙
# iptables -P FORWARD ACCEPT
永久关闭防火墙:
# ufw disable
# iptables -P INPUT ACCEPT
# iptables -P FORWARD ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -F
IP转发:
# sysctl net.ipv4.conf.all.forwarding=1
如图所示:
主机1:
主机2:
13、故障解决
【无法启动】
删除/var/lib/docker/*
【安全校验】
修改docker的配置文件/etc/default/docker,新增:
DOCKER_OPTS="--insecure-registry 127.0.0.1:5000"
[root]# service docker restart
【改dns server】
[root]# vi /etc/default/docker
去掉“docker_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"”前的#号
【docker访问宿主机kafka服务变慢】
vi /etc/resolv.conf
nameserver 172.17.1.1 #(docker网关)
nameserver 192.168.0.4 #(宿主机)
vi /etc/hosts
192.168.0.2 yitaai-2
192.168.0.4 yitaai-1
【docker启动tomcat变慢】
所以解决方案就是:直接改jdk的配置,建议使用独立jdk
打开jdk安装路径 $JAVA_PATH/jre/lib/security/java.security 这个文件,找到下面的内容:
securerandom.source=file:/dev/random
替换成:
securerandom.source=file:/dev/./urandom
【常用命令】
docker run -it --name a0262000091 ubuntu /bin/bash 创建并启动一个容器,在run后面加上-d参数,则会创建一个守护式容器在后台运行。
docker run -it --name a0262000091 -rivileged=true ubuntu /bin/bash #拥有root权限,可以调用宿主机硬件资源
docker run -it --name a0262000091 --net host ubuntu /bin/bash #--net host使用主机网络,不使用桥接
docker run -p 30001:22 --name a0262000091 -v /mnt:/mnt -d ubuntu /run.sh #端口映射,共享mnt目录,支持外部访问容器
docker run --dns 114.114.114.114 --name ubuntu -it ubuntu:latest /bin/bash #使用dns
docker start con_name 启动容器
docker stop con_name 停止容器
docker exec -it con_name /bin/bash 进入容器
docker ps -a 查看容器
docker ps -s 查看启动的容器(-ls 显示大小)
docker rm con_name 删除容器
docker rmi new_os 删除镜像
docker tag ae4c68582487 new_REPOSITORY:new_TAG 修改镜像、TAG名称(会新建,不会删除旧镜像)
docker rename old_name new_name 重命名容器
docker attach con_name 将终端附着到正在运行的容器名为con_name的容器的终端上面去,前提是创建该容器时指定了相应的sh,执行这个命令后,按下回车键,会进入容器的命令行Shell中。
docker logs con_name 获取容器名为con_name的容器日志
docker inspect 查看容器的详细信息
docker top con_name 查看容器名为con_name的容器内部的进程
docker version 查看docker版本以及go版本(docker本身是用go语言写的)
复制主机的localtime: docker cp /etc/localtime containerid:/etc/localtime (还要修改宿主机时间-以来宿主机)
【变更docker配置】
docker update --restart=always 0b2616b0e5a8
【删除依赖镜像】
删除images是报错存在child镜像,查询依赖镜像命令:(xxxx为需要删除的镜像ID)
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=xxxxxx)
【参数配置】
docker使用cgroups控制cpu占用:
#systemd-cgls #来查看系统cgroups tree
#cd /sys/fs/cgroup/cpu/docker/${systemd-cgls}查询的pid
vi cpu.cfs_quota_us 设为 50000 #相对于cpu.cfs_period_us的100000是50%
-d, --detach=false 指定容器运行于前台还是后台,默认为false
-i, --interactive=false 打开STDIN,用于控制台交互
-t, --tty=false 分配tty设备,该可以支持终端登录,默认为false
-u, --user="" 指定容器的用户
-a, --attach=[] 登录容器(必须是以docker run -d启动的容器)
-w, --workdir="" 指定容器的工作目录
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
-m, --memory="" 指定容器的内存上限
-P, --publish-all=false 指定容器暴露的端口
-p, --publish=[] 指定容器暴露的端口
-h, --hostname="" 指定容器的主机名
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="0,1或0-1" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
--device=[] 添加主机设备给容器,相当于设备直通
--dns=[] 指定容器的dns服务器
--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
--entrypoint="" 覆盖image的入口点
--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
--link=[] 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge" 容器网络设置:
bridge 使用docker daemon指定的网桥
host //容器使用主机的网络
container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
none 容器使用自己的网络(类似--net=bridge),但是不进行配置
--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="no" 指定容器停止后的重启策略:
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
【宿主主机同步时间】
方法一、对于已经在运行的容器
将宿主的文件复制到容器目录下
docker cp /etc/localtime ebe58946cb07:/etc/
docker cp /etc/timezone 37c1f697b569:/etc/
方法二、在创建容器时可插入如下命令
-v /etc/localtime:/etc/localtime:ro
【创建容器命令】
【普通+NV】
docker run -p 30010:22 --name TestD -v /data1/docker_disk/yita_netty:/work --cpuset-cpus=24,25,26,27,28,29,30,31 -m 8g --memory-swap 0 -it -d flyceek/centos7-ssh
docker run -p 30025:22 --name TestD --dns=172.17.0.1 -v /data1/baode/mnt/work:/work -it -d ubuntu14.04-ci:v1 /run.sh
nvidia-docker run -p 30199:22 --name CIMASTER --dns=172.18.1.1 --net cinet --ip 172.18.1.99 --restart=always -v /data1/baode/mnt/work:/work -itd ci-gpu-ub14.04:r5 /run.sh
【docker配置网段】
# vi /etc/docker/daemon.json
【172.17.1.0】
{
"bip": "172.17.1.1/24",
"fixed-cidr": "172.17.1.0/24",
"mtu": 1500,
"dns": ["8.8.8.8","192.168.0.2"]
}
【172.17.0.0】
{
"bip": "172.17.0.1/24",
"fixed-cidr": "172.17.0.0/24",
"mtu": 1500,
"dns": ["8.8.8.8","192.168.0.4"]
}