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:

docker ffmpeg ubuntu 安装 ubuntu安装docker命令_ubuntu16安装docker


主机2:

docker ffmpeg ubuntu 安装 ubuntu安装docker命令_docker_02

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"]
}