docker介绍
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。可以模糊的理解为轻量级的虚拟机(其实不是虚拟机)。重要的是开源。。。
docker 架构
docker 命令
查看docker的images
docker images
查看docker当前进程:
docker ps
docker运行image
docker run -p 8000:80 -d image的名字
docker run -it --name=ctf -p 5100:80 -d andreisamuilik/php5.5.9-apache2.4-mysql5.5
解释 docker的-p 是代表了端口映射,把image的80端口映射到本机的8000端口,-d是把这个进程当守护进程来执行。
向docker里边拷贝文件
docker cp 本机文件名 docker容器的id:docker容器里的路径
例: docker cp index.html 9b9cb95443b5:/usr/share/
停止docker容器
docker stop docker容器的id
在docker容器内做的改动,都是暂时的。没有被保存。
保存对docker容器的修改
docker commit -m '信息' docker容器的id 生成的image名字
删除image
docker rmi image的id
删除停止后的容器记录
docker rm 容器的id
进入容器
docker exec it 容器id /bin/bash
命令小结
命令 | 用途 |
---|---|
docker pull | 获取image |
docker build | 创建image |
docker images | 列出本地image |
docker run | 运行容器 |
docker rm | 删除已经停止的容器 |
docker rmi | 删除image |
docker cp | 主机和容器中拷贝文件 |
docker commit | 保存改动过的容器为新的image |
dockerfile
第一个dockerfile:
FROM alpine:latest
MAINTAINER alex
CMD echo "hello alex!"
解释:第一句是一个基础类,相当与c语言中的include <stdio.h>
第二句 后面的词代表了作者。
通过dockerfile来生成image
docker build -t hello_alex .
解释 -t 后面是标签名
.代表的是包当前文件夹下的所有文件都送给docker demain来生成image。实际上就是路径
第二个dockerfile
FROM ubuntu
MAINTAINER alex
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx-core
COPY index.html /var/www/html
ENTRYPOINT ["/usr/sbin/nginx","-g", "daemon off;"]
EXPOSE 80
第三句就是加速
最后一句是暴露端口
命令 | 用途 |
---|---|
FROM | 基础image |
RUN | 执行命令 |
ADD | 添加文件(可以添加远程文件) |
COPY | 拷贝文件 |
CMD | 执行命令 |
EXPOSE | 暴露端口 |
WORKDIR | 运行命令指定路径 |
MAINTAINER | 维护者 |
ENV | 设置环境变量 |
ENTRYPOINT | 容器入口 |
USER | 指定用户 |
VOLUME | mount point(挂载卷) |
镜像仓库
在镜像仓库搜索image
docker search 镜像名
下载镜像
docker pull 镜像名
本地复制docker镜像
docker tag 要复制的镜像名 新镜像的名字
向仓库传本地镜像
docker login
登陆
docker push 要上上传的image名字
docker下ubuntu16.04上搭建lamp环境:
安装php
参考:ubuntu 使用apt-get install 安装php5.6–php7
安装apache2:
apt-get install -y apache2
service apache2 start //开启apache2服务
安装mysql:
apt-get -y install mysql-server mysql-client
然后存在几个问题。
1.dockerfile在执行的时候不接受任何需要输入的参数,所以我们需要把输入的东西写在dockerfile里,否则dockerfile在运行到需要接受参数的地方就是一直处于等待状态。这里用到了静默安装。请参考
Linux下实现软件的静默安装 debconf
2.CMD容器启动命令,执行完命令会自动退出。
解决的两种方法:
方法一
写在
dockerfile里写
CMD ["/run.sh"]
run.sh里写
source /etc/apache2/envvars
exec apache2 -D FOREGROUND
或者
ENTRYPOINT [ "/usr/sbin/apache2" ]
CMD ["-D", "FOREGROUND"]
我的理解就是把apache2当作守护进程,一直运行,保证容器不退出。
缺点:不能重启apache服务。
参考文章:
CMD 容器启动命令
方法二:
dockerfile里写
CMD ["/run.sh"]
run.sh里写
while true
do
sleep 1
done
命令一直不退出,就能保证容器一直在运行。
参考文章:
dockerfile->LAMP
综上所述,dockerfile如下:
FROM ubuntu:16.04
MAINTAINER alex
RUN apt-get update && \
apt-get install -y apache2 software-properties-common && \
LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php && \
apt-get update && \
apt-get install -y \
libapache2-mod-php5.6 \
php5.6 \
php5.6-cli \
php5.6-curl \
php5.6-dev \
php5.6-gd \
php5.6-imap \
php5.6-mbstring \
php5.6-mcrypt \
php5.6-mysql \
php5.6-pgsql \
php5.6-pspell \
php5.6-xml \
php5.6-xmlrpc \
php-apcu \
php-memcached \
php-pear \
vim \
&& apt-get clean \
&& rm -fr /var/lib/apt/lists/*
RUN apt-get update && \
echo 'mysql-server-5.7 mysql-server/root_password password root' | debconf-set-selections && \
echo 'mysql-server-5.7 mysql-server/root_password_again password root' | debconf-set-selections && \
apt-get -y install mysql-server && \
apt-get -y install mysql-client && \
apt-get clean && \
rm -fr /var/lib/apt/lists/*
COPY html/ /var/www/html/
COPY run.sh /run.sh
RUN chmod 755 /run.sh && \
chmod 755 -R /var/www/html/
EXPOSE 80
CMD ["/run.sh"]
run.sh:
#!/bin/bash
chown www-data:www-data /var/www/html -R
## 关闭报错机制
if [ "$ALLOW_OVERRIDE" = "**False**" ]; then
unset ALLOW_OVERRIDE
else
sed -i "s/AllowOverride None/AllowOverride All/g" /etc/apache2/apache2.conf
a2enmod rewrite
fi
## 指定端口
echo "ServerName localhost:80" >>/etc/apache2/apache2.conf
service mysql restart
service mysql stop
# initialize database
mysqld_safe --skip-grant-tables --skip-networking &
sleep 5
## change root password
mysql -uroot -e "use mysql;update user set authentication_string=PASSWORD('alex') where User='root';update user set plugin='mysql_native_password';flush privileges;"
## 解决mysql5.7的中文乱码问题
echo "no-auto-rehash
default-character-set=utf8
safe-updates">>/etc/mysql/conf.d/mysql.cnf
echo "character-set-server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES">>/etc/mysql/mysql.conf.d/mysqld.cnf
## restart mysql
service mysql restart
mysql -uroot -palex < /var/www/html/sql.sql
rm /var/www/html/sql.sql
## 解决vim汉语乱码问题
echo "set fileencodings=ucs-bom,utf-8,latin1,gbk,cp936,gb2312
set termencoding=utf-8
set fileformats=unix
set encoding=prc">>~/.vimrc
## 修改apache的一些配置
rm -rf /etc/apache2/apache2.conf /etc/apache2/mods-available/php5.6.conf
mv /var/www/html/apache2.conf /etc/apache2/
mv /var/www/html/php5.6.conf /etc/apache2/mods-available/
chomd 644 -R /etc/apache2/
service apache2 restart
rm -rf /var/www/html/index.html
## 防止容器退出
while true
do
sleep 1
done
其他的tips:
安装 vim:
apt-get install -y vim
echo "set fileencodings=ucs-bom,utf-8,latin1,gbk,cp936,gb2312
set termencoding=utf-8
set fileformats=unix
set encoding=prc">>~/.vimrc
#为了vim能显示中文
在shell中修改mysql密码写法:
mysql版本小于5.7
service mysql stop
# initialize database
mysqld_safe --skip-grant-tables&
sleep 5
## change root password
mysql -uroot -e "use mysql;UPDATE user SET password=PASSWORD('alex') WHERE user='root';FLUSH PRIVILEGES;"
## restart mysql
service mysql restart
mysql版本大于等于5.7
service mysql restart #dockerfile中刚安装好mysql的时候需要先重启
service mysql stop
# initialize database
mysqld_safe --skip-grant-tables --skip-networking &
sleep 5
## change root password
mysql -uroot -e "use mysql;update user set authentication_string=PASSWORD('alex') where User='root';update user set plugin='mysql_native_password';flush privileges;"
## restart mysql
service mysql restart
修改apache服务的配置:
apache目录权限控制
设置.phps,可以访问把
vim /etc/apache2/mods-available/php5.6.conf
把这部分添加注释
#<FilesMatch ".+\.phps$">
# SetHandler application/x-httpd-php-source
# Deny access to raw php sources by default
# To re-enable it's recommended to enable access to the files
# only in specific virtual host or directory
# Require all denied
#</FilesMatch>
重启apache服务
修改mysql5.7的默认编码:
参考:Linux mysql 5.7.22设置中文编码-解决乱码问题
echo "no-auto-rehash
default-character-set=utf8
safe-updates">>/etc/mysql/conf.d/mysql.cnf
echo "character-set-server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES">>/etc/mysql/mysql.conf.d/mysqld.cnf
重启mysql后有效。
show variables like 'character%'; #查看字符集
未完待续。。。