前言

记录我遇到的坑,so win10的同学请另行百度
环境:物理机win7x64 ,使用物理机安装virtualbox,virtualbox安装docker提供的最小化linux系统,在该系统里运行docker,再docker里面跑容器
一句话总结,玩docker还是要linux
时间:2017-03-17
时间很重要,新技术更新换代快,我照书做的差点没做成,还是要靠google,(

安装Docker

https://www.docker.com/products/docker-toolbox

下载Docker Toolbox

(《Docker技术入门与实战》一书,我手头上的是2015年2月第1版第2次印刷,里面使用的是Boot2Docker进行安装,so已过时o(︶︿︶)o )

docker 打卡签到 docker 签到狗_Docker


安装后桌面会多出这三个图标

docker 打卡签到 docker 签到狗_mysql_02


简单来说DockerToolbox=VirtualBox+git gui打开Docker Quickstart Terminal

会要求下载boot2docker.iso

docker 打卡签到 docker 签到狗_docker_03


但是这年头git下载个东西都慢慢的,所以X掉他,自己手动复制粘贴过去还快一点。

根据自己的安装路径,找到该文件

“C:\Program Files\Docker Toolbox\boot2docker.iso”

然后复制到对应的路径

“C:\Users\xxx.docker\machine\cache\boot2docker.iso”再打开Docker Quickstart Terminal,等候鲸鱼出现,如图所示

docker 打卡签到 docker 签到狗_ubuntu_04


其实这个东西很卡,也不能复制粘贴

所以打开VirtualBox

docker 打卡签到 docker 签到狗_ubuntu_05


default虚拟机就是boot2docker.iso所建的cdlive

点击显示

docker 打卡签到 docker 签到狗_docker_06


至此环境安装部分已完成。

但是想要与虚拟机进行通信,例如使用ssh进去还是有点问题,ping docker的ip发现目标不可达,无法通信(可能是我的电脑问题。)

检查ip发现问题所在

docker 打卡签到 docker 签到狗_Docker_07


docker一般使用192.168.99.100作为其ip

我们打开cmd,ipconfig查看自己ip

会发现VirtualBox对应的本应该是192.168.99.101的ip的网卡,却不能获取ip地址

docker 打卡签到 docker 签到狗_Docker_08


想办法刷新几次,让dhcp获取ip就可以了

我这里使用的是使用管理员权限执行

netsh interface ip set address “VirtualBox Host-Only Network” dhcp

执行多几次后刷到ip可以ping到就可以ssh进去了。(ssh账户密码 docker:tcuser)

hello-world

程序员的自我修养

$ docker pull hello-world
如果失败,就试多几次
如果还是失败,就使用国内的镜像吧
$ docker pull daocloud.io/hello-world
(这里照书本的应该是dockerpool,但是好像已经挂了o(︶︿︶)o )
((晚上整理笔记的时候,写到这里,想再pull一次然后截图,发现连接不上..神奇的事情))
然后就是运行
$ docker run hello-world

既然能run hello-world,就能run其他了,好的接下来就pull run ubuntu开始玩了
官方pull下来的ubuntu是最小化安装起的容器,比linux安装选项中选择最小化安装还要最小化,各种软件程序服务功能例如ifconfig都没有,我这里想看ip和其他硬件信息,百度折腾了好久都无果,看不了,没办法只能安装ifconfig来看了。

ubuntu 换源的坑

ubuntu官网的源太慢了,于是就换了一个源,但是换源之后安装各种软件都是依赖有问题
后来百度发现apt-get install还有依赖问题的话说明是源的问题
再百度到这篇文章,发现是codename的问题
而要看codename,可以查看ubuntu里原始的sources.list里面的codename,或者使用很慢的官方源安装lsb再使用lsb_release来查看。

网上全是抄来抄去的,真是浪费我的时间。

根据我选了网易163的源,并修改codename

deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse

静默安装mysql

apt-get install mysql-server的时候还要求输入密码,但是在无交互的Dockerfile里面如果这样写就炸了,docker build后会一直等待镜像创建完成,而apt-get在等待输入密码,就会一直卡在那里了。
百度后在stackoverflow找到解决方法
install mysql without password(学好英语很重要

echo "mysql-server mysql-server/root_password password 123456" | debconf-set-selections
echo "mysql-server mysql-server/root_password_again password 123456" | debconf-set-selections
apt-get install -y mysql-server

这里要注意空格,password后面的123456就被当作密码了。我之前网上复制粘贴下来的因为排版原因多了一个空格,导致密码错误,然后登录不进去,一直报的ERROR 1045 (28000): Access denied for user ‘root’@’localhost’
然后我使用交互式的apt-get install mysql-server,打密码后登录成功,这下我就慌了,然后开两个容器,一边是静默安装,一边是手动交互安装,再比对cnf配置文件,都没发现有什么问题,哇,灵异事件!
再后来通过百度的mysql忘记密码如何重置密码,来进行排错,更确认了两个容器里的mysql都是一样的,没什么区别,那么可能就是密码不正确的问题了,最后才发现是密码多了个空格Orz
费了一晚上的时间+一晚上烦躁的心情 _(:зゝ∠)_

my lamp

#Dockerfile
FROM ubuntu
MAINTAINER from 127.0.0.1 by zzz
ENV DEBIAN_FORNTEND noninteractive
#换源,注意xenial为codename,查看原始的/etc/apt/sources.list或使用lsb_release -a查看
RUN echo "deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse" > /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse" >> /etc/apt/sources.list
#使用-qq --no-install-recommends,不输出多余的信息,不安装非必须的东西,减少镜像体积
RUN apt-get update
RUN apt-get install -qqy --no-install-recommends net-tools
RUN apt-get install -qqy --no-install-recommends vim
RUN apt-get install -qqy --no-install-recommends openssh-server
RUN apt-get install -qqy --no-install-recommends curl
RUN apt-get install -qqy --no-install-recommends telnet
RUN apt-get install -qqy --no-install-recommends apache2
RUN apt-get install -qqy --no-install-recommends php libapache2-mod-php7.0

#静默安装mysql
RUN echo "mysql-server mysql-server/root_password password 123456" | debconf-set-selections
RUN echo "mysql-server mysql-server/root_password_again password 123456" | debconf-set-selections
RUN apt-get install -qqy --no-install-recommends mysql-server

#抄书的设置时区
RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata

#抄书和百度的修改root密码,允许使用root登录
RUN mkdir -p /var/run/sshd
RUN sed -ri 's/PermitRootLogin .*/PermitRootLogin yes/g' /etc/ssh/sshd_config 
RUN echo root:123456 | chpasswd
RUN echo '<?php phpinfo()?>' > /var/www/html/phpinfo.php
ADD run.sh /run.sh
RUN chmod 755 /run.sh

#抄书的环境变量配置
RUN mkdir -p /var/lock/apache2 
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_SERVERADMIN admin@localhost
ENV APACHE_SERVERNAME localhost
ENV APACHE_SERVERALIAS zzz.localhost
ENV APACHE_DOCUMENTROOT /var/www

EXPOSE 22
EXPOSE 80
WORKDIR /var/www/html
CMD ["/run.sh"]
#!/bin/bash
/usr/sbin/sshd &
service mysql start &
exec apache2 -D FOREGROUND

$ docker bulid -t lamp:my .

至此大功告成,镜像大小643M

在运维的路上越走越远_(:зゝ∠)_

(结尾添加关键字词提高收录率:
apt-get 解决依赖
安装mysql 不输入密码