====== Docker简介 ======
===== 新服务器安装Docker及容器 =====
* 安装Docker
* Docker配置
* 创建Dockerfile
* 通过Dockerfile生成镜像
* 基于镜像生成容器
====== Docker安装 ======
===== Docker for Windows =====
* Windows版本要求:Win10,64位,Pro/Enterprise/Education版,1607以上版本
* 需要打开Hyper-V
* 下载Docker for Windows然后打开下载的文件按照提示安装即可
===== Docker CE for Ubuntu =====
参考[[https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/|Docker CE for Ubuntu官方文档]]
* Ubuntu版本:64位,14.04/16.04/17.04/17.10以上版本
* 设置Ubuntu源
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
* 安装DockerCE
sudo apt-get update
sudo apt-get install docker-ce
* 验证安装是否成功
sudo docker run hello-world
===== Docker CE for CentOS (通过yum安装) =====
参考[[https://docs.docker.com/engine/installation/linux/docker-ce/centos/|Docker CE for CentOS官方安装文档]]
* 安装需要的其他程序
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
* 配置Docker到yum库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
* 安装Docker
sudo yum install docker-ce
* 启动Docker
sudo systemctl start docker
===== Docker CE for CentOS(Offline) =====
参照:[[https://docs.expertflow.com/chat/latest/hybrid-chat-deployment/docker-based-deployment/setup-docker-engine-on-centos-offline|Setup Docker Engine on Centos Offline - Hybrid Chat]]
==== 下载安装包 ====
===== Docker Toolbox =====
===== Docker for ArchLinux =====
# Arch源自带docker安装包,所以直接使用pacman就可以安装
sudo pacman -Sy docker
====== Docker配置 ======
===== Docker国内镜像加速 =====
参考[[https://www.docker-cn.com/registry-mirror|Docker中国镜像加速]]
在''%%/etc/docker/daemon.json%%''(如果没有该文件则创建该文件)中添加如下内容:
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
如果是阿里云服务器,建议使用阿里云镜像加速,具体见https:%%//%%www.jianshu.com/p/1a4025c5f186
===== Docker for Linux安装后配置 =====
==== 非root用户使用Docker ====
如果将当前用户添加到docker用户组:
sudo usermod -aG docker $USER
如果将其他用户添加到docker用户组:
sudo usermod -aG docker
====== Docker常用操作 ======
===== Docker操作流程 =====
* 获取镜像:可以通过''%%docker pull /%%''拉取已有镜像,也可以通过''%%docker build -t .%%''通过Dockerfile生成镜像
* 生成容器:''%%docker run --name -p : -dit [:image_version]%%''
* 发布镜像:''%%docker commit [-m ] [:image_version]%%'', ''%%docker push /[:tag]%%''
===== Docker镜像操作 =====
* 查看镜像:''%%docker images%%'', ''%%docker images -as%%''
* 删除镜像:''%%docker rmi /%%''
* 导出镜像:''%%docker save -o %%''
* 导入镜像:''%%docker load -i %%''
===== Docker容器操作 =====
* 查看容器:''%%docker container%%''或''%%docker ps%%'',''%%docker ps -a%%''(查看所有容器,包括已经停止的容器), ''%%docker ps -as%%''(查看所有容器并显示容器占用的空间大小)
* 停用容器:''%%docker stop %%''
* 启动容器:''%%docker start %%''
* 删除容器:''%%docker rm %%''
===== Docker复制操作 =====
* 系统复制到容器:''%%docker cp <系统文件路径> <容器>:<容器路径>%%''
* 容器复制到系统:''%%docker cp <容器>:<文件路径> <系统路径>%%''
* 容器之间不能相互copy
====== Dockerfile ======
Java Web示例:
# 基于Uuntu16.04
FROM ubuntu:16.04
# 避免安装软件提示dpkg配置错误
ARG DEBIAN_FRONTEND=noninteractive
# 支持显示中文
ENV LANG C.UTF-8
# 切换Ubuntu源为中国的源
RUN sed -i 's/archive/cn\.archive/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y --no-install-recommends apt-utils
RUN apt-get install -y --no-install-recommends bash-completion
RUN apt-get install -y --no-install-recommends apt-transport-https ca-certificates
RUN apt-get install -y --no-install-recommends vim openssh-server wget
# 安装tomcat和mysql等
RUN apt-get install -y --no-install-recommends git maven openjdk-8-jre openjdk-8-jdk
RUN apt-get install -y --no-install-recommends mariadb-server mariadb-client tomcat8
# 修改maven镜像
RUN wget -q https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/latest/jenkins.war
RUN cp jenkins.war /var/lib/tomcat8/webapps
# 修改ssh配置以允许远程登录root用户
RUN sed -i 's/PermitRootLogin\ prohibit-password/PermitRootLogin\ yes/g' /etc/ssh/sshd_config
# 配置tomcat内存
RUN sed -i 's/Xmx128m/Xmx4096m/g' /etc/default/tomcat8
# 清理apt缓存
RUN rm -rf /var/cache/apt/archives/*
# 开放端口
EXPOSE 3306
EXPOSE 8080
EXPOSE 80
EXPOSE 22
# 命令行自动补全
RUN echo "if ! shopt -oq posix; then" > ~/.bashrc
RUN echo " if [ -f /usr/share/bash-completion/bash_completion ]; then" >> ~/.bashrc
RUN echo " . /usr/share/bash-completion/bash_completion" >> ~/.bashrc
RUN echo " elif [ -f /etc/bash_completion ]; then" >> ~/.bashrc
RUN echo " . /etc/bash_completion" >> ~/.bashrc
RUN echo " fi" >> ~/.bashrc
RUN echo "fi" >> ~/.bashrc
# 自启动脚本
RUN echo "#!/usr/bin/env bash" > ~/start.sh
RUN echo "service ssh start" >> ~/start.sh
RUN echo "service mysql start" >> ~/start.sh
RUN echo "service tomcat8 start" >> ~/start.sh
RUN chmod a+x ~/start.sh
# 其他bashrc配置
RUN echo "alias ll='ls -alF'" >> ~/.start.sh
CMD ~/start.sh && /bin/bash
Django示例
# 基于Uuntu16.04
FROM ubuntu:16.04
# 避免安装软件提示dpkg配置错误
ARG DEBIAN_FRONTEND=noninteractive
# 支持显示中文
ENV LANG C.UTF-8
# 切换Ubuntu源为中国的源
RUN sed -i 's/archive/cn\.archive/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y --no-install-recommends apt-utils
RUN apt-get install -y --no-install-recommends bash-completion
RUN apt-get install -y --no-install-recommends apt-transport-https ca-certificates
RUN apt-get install -y --no-install-recommends vim openssh-server wget
# 安装Apache2, python3等
RUN apt-get install -y --no-install-recommends git apache2 python3 python3-pip libapache2-mod-wsgi-py3 python3-setuptools python3-dev build-essential
RUN apt-get install -y --no-install-recommends mariadb-server mariadb-client libmysqlclient-dev
# 清理apt缓存
RUN rm -rf /var/cache/apt/archives/*
# 开放端口
EXPOSE 3306
EXPOSE 8000
EXPOSE 80
EXPOSE 22
# 命令行自动补全
RUN echo "if ! shopt -oq posix; then" > ~/.bashrc
RUN echo " if [ -f /usr/share/bash-completion/bash_completion ]; then" >> ~/.bashrc
RUN echo " . /usr/share/bash-completion/bash_completion" >> ~/.bashrc
RUN echo " elif [ -f /etc/bash_completion ]; then" >> ~/.bashrc
RUN echo " . /etc/bash_completion" >> ~/.bashrc
RUN echo " fi" >> ~/.bashrc
RUN echo "fi" >> ~/.bashrc
# 自启动脚本
RUN echo "#!/usr/bin/env bash" > ~/start.sh
RUN echo "service ssh start" >> ~/start.sh
RUN echo "service mysql start" >> ~/start.sh
RUN echo "service apache2 start" >> ~/start.sh
RUN chmod a+x ~/start.sh
# 其他bashrc配置
RUN echo "alias ll='ls -alF'" >> ~/.bashrc
CMD ~/start.sh && /bin/bash
====== 常见问题解决 ======
===== 修改已有容器的端口映射 =====
==== 方法一:提交容器为新的镜像,删除原容器后重新创建一个容器,创建时修改端口映射 ====
==== 方法二:直接修改容器的配置文件(Docker version 17.09.0-ce, build afdb6d4测试通过) ====
参考[[https://mybrainimage.wordpress.com/2017/02/05/docker-change-port-mapping-for-an-existing-container/|Docker Change Port Mapping for an Existing Container]](需要自备梯子)
* 使用docker inspect命令查看容器的id
* **停掉docker服务(这一步非常重要,不能省略)**
sudo service docker stop
* 修改config.v2.json文件(如果修改已有端口映射可以跳过此步骤)
sudo vim /var/lib/docker/containers//config.v2.json
# 在ExposedPorts中添加类似"8888/tcp": {}
* 修改hostconfig.json文件
sudo vim /var/lib/docker/containers//hostconfig.json
# 添加或修改PortBindings,类似 "80/tcp":[{"HostIp": "","HostPort": "80"}],
* 重新启动docker服务
sudo service docker start
* 启动docker容器
sudo docker start
* 启动docker容器内应该启动的程序或者服务(如果需要手动启动的情况下)
===== 自动启动容器内的service =====
* Dockerfile方式:
在dockerfile中通过加入''%%CMD service start && /bin/bash%%''。[[https://stackoverflow.com/questions/25135897/how-to-automatically-start-a-service-when-running-a-docker-container|参考链接]]
* Image方式:
在run image的时候加入需要启动时执行的命令或者脚本即可,如果container已经存在则提交后再run,类似''%%docker run --name=test -dit ubuntu service start && /bin/bash%%''
===== Tomcat在容器内通过service方式启动提示Failed =====
在执行''%%docker run%%''命令时,增加参数''%%--cap-add SYS_PTRACE%%''
===== 修改Docker镜像和容器文件路径 =====
参考链接:[[https://stackoverflow.com/questions/24309526/how-to-change-the-docker-image-installation-directory|How to change the docker image installation directory?]],[[https://forums.docker.com/t/how-do-i-change-the-docker-image-installation-directory/1169|How do I change the Docker image installation directory?]]
Docker for Linux的镜像和容器文件默认存储在/var/lib/docker文件夹中,可以改为其他路径,修改步骤为
* 停用Docker:''service docker stop''
* 备份原文件夹:''tar czf ~/docker.tar.gz /var/lib/docker''
* 移动/var/lib/docker文件夹到其他路径(**一定要使用mv命令,而不能cp再删除原文件夹** ,否则会出现容器内service start失败):''mv /var/lib/docker ~/''
* 修改docker daemon配置,即修改/etc/docker/daemon.json(如果没有则创建该文件),增加''"graph": "/home/test/docker"'' 到daemon.json文件中,Docker17以后,graph参数被禁用了,需要改为data-root。
* 启用Docker:''service docker start''
* 启动容器:''docker start ''
===== 容器内中文字符无法显示 =====
临时解决方案:
* 查看是否支持中文:容器内执行''locale'' 和''locale -a'' ,后者输出结果包含C.UTF-8则表示支持中文,前者输出结果不是C.UTF-8(例如POSIX)则表示当前设置不是中文;
* 如果支持中文,则打开''/etc/profile'' 文件,最后加入''export LANG=C.UTF-8'' 以支持中文;
* 保存修改后的文件,并执行''source /etc/profile'' 以生效(每次容器重启后都需要执行)
永久解决方案:
==== 方法一:docker run时增加-e LANG=C.UTF-8 ====
==== 方法二:Dockerfile中增加ENV LANG=C.UTF-8 ====
===== Redhat EL 6.8 docker 安装问题 =====
按照网上常见的办法去安装docker-io,一直失败,无奈只能采用离线安装的方式进行解决,主要的解决办法如下: - 下载离线需要的[[http:%%//%%w3.153.lvruan.com/uploadfile/2017/docker1.7.1.zip|依赖包]], 备用下载地址: [[https:%%//%%pan.baidu.com/s/1-07Inu8OvbumBJcf3Iy9tA|百度云盘]] 提取码: rhi3 - 按照依赖包里面的readme 安装即可
===== 容器内vim中文乱码 =====
在~/.vimrc中添加如下内容(参考[[https://blog.csdn.net/cuigelasi/article/details/82852464|Docker 容器中文乱码解决方案_cuigelasi的博客-CSDN博客_docker中文乱码]])
:set encoding=utf-8
:set fileencodings=ucs-bom,utf-8,cp936
:set fileencoding=gb2312
:set termencoding=utf-8
===== 容器内git log中文乱码 =====
参考:[[https://www.shangyexin.com/2020/01/20/docker_ubuntu_chinese/|docker中使用Ubuntu中文乱码问题解决 - 尚叶鑫的个人主页]]
git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8
执行上述命令后,在~/.bashrc中加入''%%export LESSCHARSET=utf-8%%''