代码改变世界

docker学习

2019-02-22 15:05  雄风狂飙  阅读(535)  评论(0编辑  收藏  举报

一.1. docker

一.1.1. docker安装

一.1.1.1. 安装过程

下载:

https://docs.docker.com/installation/windows

然后安装

我下载了Install Docker Desktop for Windows,但是由于我的OSwindows10home版的,不支持,据说只支持windows prowindows server

于是,只能下载DockerToolbox,下载以后安装。

 

安装成功以后可以通过以下方式登陆:

1. 打开gitbashcddocker目录,执行start.sh

2. 执行Docker Quickstart Terminal

3. 可以在secureCRT中配置ssh2连接,用户名密码是:docker/tcuser

一.1.1.2. 踩过的坑

执行Docker Quickstart Terminal

报错:

找不到bash.sh

分析:

这个是由于我的git安装目录和默认安装路径不一样所致,

解决:

只要修改快捷键Docker Quickstart Termina”的启动属性中的目标,把bash.sh的路径按照我自己的安装路径写正确即可。修改以后为:"H:\Program Files\Git\bin\bash.exe" --login -i "H:\Program Files\Docker Toolbox\start.sh"

 

报错:

处理步骤:

关闭电脑,再重启,进入BIOS,找到CPU Configuration> Intel Virtualization Technology,设置为Enabled

这个时候,会显示虚拟化启动成功:

再次执行Docker Quickstart Terminal,就可以成功了,中间需要等待一段时间。

下次打开docker,可以在gitbash中进入到docker.exe,再执行docker.exe

H:\Program Files\Docker Toolbox\docker.exe

如果出现报错,可以执行:gitbash中进入到start.sh,再执行start.sh:

$cd /h/’Program Files’/’Docker Toolbox’

$start.sh

一.1.2. docker操作命令

一.1.2.1. 基本概念

镜像:类似于虚拟机镜像,可以理解为一个面向docker引擎的只读模板,包含了文件系统。

容器:是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,这些容器都是相互隔离、互不可见的。

仓库:是docker集中存放镜像文件的场所。

一.1.2.2. 基本操作

1.镜像

国内镜像地址:网易镜像中心:https://c.163.com/hub#/m/home/ 
daocloud镜像市场:https://hub.daocloud.io/

从网易获取镜像过程:登陆网址https://c.163.com/hub#/m/home/,用户名密码:282660642@qq.com/ypb0228,搜索相应镜像,然后复制下载地址,到docker中执行便可,比如:docker pull hub.c.163.com/library/registry:latest

获取镜像:docker pull ubuntu:14.4

                                       ^       ^

                                  镜像名称  tag

          带仓库地址的命令:docker  pull dl.dockerpool.com:5000/ubuntu

查看镜像信息:docker images

为本地镜像添加新标签:docker tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:latest

查看镜像详细信息:docker inspect yourImageID

搜索镜像:docker search yourImageName

删除镜像:docker rmi yourImageIDOrTag

2.容器

创建容器:docker create -it ubuntu:latest

创建具名容器:docker create -it --name myName ubuntu

(相关容器操作中除了可以使用容器id,就还可以使用方便记忆的容器名称了)

查看已创建容器:docker  -a

查看已创建未启动容器:docker -a -q

运行一个容器,而后自动停止:docker run ubuntu /bin/echo ‘Hello’

运行一个容器,保持伪终端打开:docker run -t -i ubuntu /bin/bash

守护态启动容器:docker run -d ubuntu /bin/sh -c ‘while true;do echo ‘1’;sleep 1;done;’

启动一个容器:docker start yourDockerID

停止一个容器:docker  stop yourDockerID

重启一个容器:docker restart yourDockerID

进入容器:docker attach yourDockerID

导出容器:docker export yourDockerId >yourFileName.tar

导入容器:docker import yourFileName.tar demo:v1.0

(导入进去的容器,就可以用docker images看到了,可以用来创建新的容器)

 

3.仓库

docker本地新建仓库:

$docker run --name docker-registry -d -p 5001:5001 registry

                                                                     ^     ^

                                                          宿主机port  容器port

仓库建好以后的测试:docker@default:/$ curl -X GET http://127.0.0.1:5001/           

curl: (52) Empty reply from server

 

4.数据卷操作

创建一个数据主机,利用本机的空间:

docekr create -ti --name dataServer -v /h/tmpData:/datatmp ubuntu

                                                                      ^           ^

                                                              本地空间   主机挂载点

创建一个共享dataServer/datatmp下面的数据卷到/data下面

docker create -ti --name datangix mynginx --volumes-from dataServer /data:/datatmp

创建成功了,但是还是启动不了,启动的时候报错:

docker@default:/$ docker start datangix2

Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"--volumes-from\": executable file not found in $PATH": unknown

Error: failed to start containers: datangix2

解决方法:

docker create -ti --name datangix mynginx /bin/bash --volumes-from dataServer /data:/datatmp

 

5.网络操作

docker create -ti --name mynginx -p 192.168.99.100:8089:80 mynginx /bin/bash

#-p 说明,192.168.99.100dockerip808980,是把mynginx中的端口80映射到8089

 

6.踩过的坑:

问题:

$ docker attach b16cc744c3ed

the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'

解决:将winpty放到最前面

$ winpty docker attach b16cc744c3ed

 

问题:

导出的ubuntu镜像重命名以后再次导入,create container的时候报错:

$ docker create -it somename:v1.0

Error response from daemon: No command specified

解决:

再最后加参数:

docker create -it --name mydemo somename:v1.0 /bin/bash

 

问题:

启动docker容器以后,就是无法attach

$ winpty docker attach mydemo2

You cannot attach to a stopped container, start it first

解决:

创建的时候少了 -ti参数导致。

创建的时候加上 -ti参数即可:

docker create -ti --name mydemo2 mydemo:v1.0

 

问题:

创建一个共享dataServer/datatmp下面的数据卷到/data下面

docker create -ti --name datangix mynginx --volumes-from dataServer /data:/datatmp

创建成功了,但是还是启动不了,启动的时候报错:

docker@default:/$ docker start datangix2

Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"--volumes-from\": executable file not found in $PATH": unknown

Error: failed to start containers: datangix2

解决方法:

docker create -ti --name datangix mynginx /bin/bash --volumes-from dataServer /data:/datatmp

 

 

一.1.3. docker实战

一.1.3.1. 创建容器,并在宿主机访问

docker中新建一个nginx容器,然后在宿主机进行访问

 

先从网易docker镜像库下载nginx

在本地执行docker pull命令,如果网络有问题,但是ping 8.8.8.8没有问题,就重启一下虚拟机docker再试试。

下好以后,打个tag方便使用:

$docker tag hub.c.163.com/library/nginx mynginx

再创建nginx容器,并启动:

$docker run --detach --publish 8009:80 --name webserver mynginx:latest

docker中可以使用curl进行测试:

dockerifconfig找到相应ip

docker中使用curl进行测试,测试结果:

在宿主机进行测试,宿主机测试结果如下:

如果想建容器以后,在容器内部启动nginx

先创建容器:

docker run --detach --publish 8089:80 -ti --name mynginx3 mynginx /bin/bash

进入容器

docker attach mynginx3

$cd sbin;nginx

然后进入到docker中,用curl进行测试,ok,是通的。

一.1.3.2. 安装vim

由于官方镜像多无vim,操作起来很不方便,需要安装vim,而国外镜像下载速度慢多以失败告终,因此需要先修改到国内镜像地址。

$cd etc/apt

mv sources.list sources.list_bak

然后用>>sources.list 中添加内容:

echo 'deb http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse'>>sources.list

echo 'deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse'>>sources.list

echo 'deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse'>>sources.list

echo 'deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse'>>sources.list

echo 'deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse'>>sources.list

echo 'deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse'>>sources.list

echo 'deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse'>>sources.list

echo 'deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse'>>sources.list

echo 'deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse'>>sources.list

echo 'deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse'>>sources.list

而后,再使用apt-get update

apt-get install vim进行安装

一.1.3.3. 容器可以通过ssh进行访问

安装ssh

$apt-get install openssh-server

$mkdir /var/run/sshd

启动ssh服务:

$/usr/sbin/sshd -D &

使用netstat查看一下,发现netstat未安装,$apt-get install net-tools

然后使用netstat确实可以看到已经在22端口进行监听。

然后,使用docker commit 保存镜像,

再次按照保存好的镜像创建一个容器,启动sshd服务,把docker10022端口映射到容器的22端口中。

 

问题:

但是使用sshdocker中登陆的时候,提示密码错误。不晓得如何解决。

docker$ssh 192.168.99.100 #tcuser为密码可以登陆,但是$ssh 192.168.99.100 -p 10022 #tcuser 为密码提示密码错误

原因分析: