Docker容器技术的特点

1
2
3
4
5
6
7
8
9
10
11
12
13
文件系统隔离:每个进程容器运行在完全独立的根文件系统里。
资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。
网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址。
写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。
日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。
所以:ABC对,而D,Docker采用的是资源共享型的管理方案,所有的Docker使用的硬件资源由docker daemon进行管理与分配。

A.文件、资源、网络隔离
B.变更管理、日志记录
C.写时复制
D.独立的资源划分

安装

centos 安装安装docker官方文档

1
2
3
4
5
6
sudo yum remove docker # 删除 老的版本
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io

命令

  • run
  • start
  • stop
  • restart
  • log

win拷贝容器文件到本地(linux 把 copy 换成 cp 即可)

1
2
3
4
5
6
- `copy /?`帮助
- `docker exec -it jenkins copy test.txt a.html`复制文件到文件

- `docker exec -it jenkins copy /var/test.txt a.html`复制文件到文件
- `docker exec -it jenkins copy /var/test.txt test\`复制文件或文件夹下的子文件到文件夹
- `docker exec -ti -u root jenkins bash``root`权限链接到`docker`

重启docker服务

1
2
systemctl restart docker
sudo service docker restart

关闭docker

1
2
systemctl stop docker
service docker stop

doker停止后启动方法

1
2
3
4
systemctl start docker
systemctl status docker
service docker start
docker run hello-world # 自带的官网应用

查看是否启动成功

  • docker ps -a

查看命令

  • docker ps正在运行的镜像
  • docker ps -a所有镜像
  • netstat -tlunp查看端口

进入容器内部执行命令

  • 方法一docker exec -it 38a2cae4c63f sh
  • 方法二docker exec -it blog sh

镜像加速

  • 方法一docker --registry-mirror=https://registry.docker-cn.com daemon
  • 方法二vi /etc/docker/daemon.json—>{"registry-mirrors":["https://registry.docker-cn.com"]}
  • 重启daemonsystemctl daemon-reload
  • 重启dockersystemctl restart docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker start hello-world # 也可以是 hello-world 的 id
docker rm hello-world # 也可以是 hello-world 的 id
docker stop hello-world # 也可以是 hello-world 的 id
docker restart hello-world # 也可以是 hello-world 的 id
docker log
# 在docker反复build后,会存留很多none镜像,下面命令一键删除所有none镜像
docker rmi `docker images | grep '<none>' | awk '{print $3}'`
# 更简单方法
docker rmi `docker images -q -f dangling=true`
docker rmi $(docker images -q -f dangling=true)
# 删除所有停止的容器
docker rm $(docker ps -a -q)

# 或者还有
docker system prune 按 y

安装 mysql

1
2
3
4
5
6
7
8
docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
docker ps # test-mysql 已经在运行了
docker stop test-mysql
docker start test-mysql
docker logs -f test-mysql

# 端口映射出去
docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql # 3306 是 docker 内部的端口,映射为外部端口 27000

容器备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
docker ps
docker commit -p 30b8f18f20b4 ali_jenkins
docker login
# 上传之前,要先对镜像加tag
# tag后面第一个参数是镜像名称,第二个参数是新的tag名称(其中 cxvh 是镜像名称,alijenkins 是)
docker tag ali_jenkins cxvh/alijenkins:v1.0
docker push cxvh/alijenkins:v1.0
# 此时已经备份成功

# 下载镜像
docker pull cxvh/alijenkins:v1.0
# 配置 docker-compose.yml 或者直接运行
version: "2.2"
services:
jenkins:
container_name: "jenkins"
# lts 意思是长期支持版
image: cxvh/alijenkins:v1.0
restart: always
user: jenkins:994
ports:
- "8001:8080"
- "50000:50000"
- "10051:10051"
volumes:
- ./data:/var/jenkins_home
- /usr/bin/docker:/usr/bin/docker
- /var/run/docker.sock:/var/run/docker.sock
# 运行起来
docker-compose up -d

docker的debian中安装python和node

  • docker exec -it -u root coder_coder_1 shroot角色进入docker
  • sudo apt-get -y update更新apt-get
  • sudo apt-get install aptitude安装aptitude
  • sudo aptitude -y install gcc make zlib1g-dev libffi-dev libssl-dev安装依赖包
  • apt-get install vim如果没有vim则需要安装
  • apt-get install wget如果没有wget则需要安装
  • wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz下载 Python 3.6.9
  • tar -xzvf Python-3.6.9.tgz解压压缩包
  • cd Python-3.6.9/进入文件夹
  • ./configure --prefix=/usr/local/python36安装配置
  • make && make install安装配置
  • sudo chmod 777 -R /usr/local/python36赋予权限
  • vim ~/.bashrc打开环境变量
  • export PATH=/usr/local/python36/bin:$PATH最后一行加入
  • source ~/.bashrc使配置的环境变量生效
  • sudo apt-get install nodejs
  • sudo apt-get install npm

安装 showdoc

官网

  • 原版官方镜像安装命令(国内用户配置阿里容器加速)
    • docker pull star7th/showdoc
  • 新建存放showdoc数据的目录
    • mkdir -p /showdoc_data/html
    • chmod -R 777 /showdoc_data
  • 启动showdoc容器
    • docker run -d --name showdoc --user=root --privileged=true -p 4999:80 -v /showdoc_data/html:/var/www/html/ star7th/showdoc
    • docker run -d --name showdoc --user=root --privileged=true -p 8003:80 -v \html:/var/www/html/ star7th/showdoc
    • docker run -d --name showdoc --user=root --privileged=true -p 4999:80 -v E:/learn/showdoc/html:/var/www/html/ star7th/showdoc
  • 数据转移
    • docker exec showdoc 进入到容器
    • docker exec showdoc cp -fr /showdoc/html /var/www/html从容器拷贝数据
  • 默认账号showdoc
  • 默认密码123456
  • 创建用户->登录->创建项目

小技巧

  • 忘记密码?设置无密码访问docker?
    • vi config.xml,改标签useSecurity的值为false,保存退出重启docker
  • 如何创建一个在3306端口的容器名称为mysql的Mysql容器,创建后在后台持续运行?
    • docker run -itd --name mysql -p 3306:3306 -e=MYSQL_ROOT_PASSWORD=123456 mysql
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      docker run 命令来创建
      itd交互式终端后台运行
      name指定容器名称
      p指定映射端口
      最后Mysql比较特殊,需要指定MYSQL_ROOT_PASSWORD变量 + mysql镜像名称
      正确的命令是:docker run -itd --name mysql -p 3306:3306 -e=MYSQL_ROOT_PASSWORD=123456 mysql
      `docker start mysql -p 3306:3306 -e=MYSQL_ROOT_PASSWORD=123456 mysql`与`docker start -p 3306:3306 -e=MYSQL_ROOT_PASSWORD=123456 mysql` start命令只能运行一个已经存在mysql容器,但是无法创建
      `docker run -p 3306:3306 -e=MYSQL_ROOT_PASSWORD=123456 mysql`正常创建并运行,但是退出终端后,可能会被停止Mysql
      # 推荐:
      docker run --name mysql-name -d -p 3306:3306 mysql
      然后使用docker start/stop/restart mysql-name命令进行管理
  • Docker 容器暴露多个端口
    1
    2
    docker run -p <host_port1>:<container_port1> -p <host_port2>:<container_port2>
    sudo docker run -it -p 8801:8080 -p 50000:50000 -p 10051:10051 -v /home/jenkins/data:/var/jenkins_home cxvh/alijenkins:v1.0
  • Jumpserver
    • sudo docker stop $(sudo docker ps -aq)停掉Jumpserver相关的所有容器
  • 在用户权限下docker命令需要sudo,否则报错Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.
    • 可以把用户添加到用户组
    • sudo groupadd userdocker添加userdocker用户组
    • sudo gpasswd -a $USER userdocker将登陆用户加入到userdocker用户组中 or sudo gpasswd -a yonghuming userdocker
    • newgrp docker更新用户组并重启docker

常见报错

  • 重启系统后运行 docker ps 报错?Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
  • 解决方法:
    • systemctl daemon-reload
    • systemctl restart docker.service
  • docker 拉取的 mysql 版本不支持?1251 - client does not support authentication protocol requested by server consider upgrading
  • 解决方法:1.指定版本 or 2.升级桌面工具
    • docker pull mysql:5.7.25
    • docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.25
  • 运行gitlab
    • firewall-cmd --add-port=13800/tcp --permanent 放行端口
    • firewall-cmd --reload 重新加载
    • docker logs -f gitlab_test 持续打印日志,看下 gitlab 做了什么事情
      • 可以看到默认用户名是 root,第一次访问地址会让创建密码
    • docker rm gitlab_test 删除容器
      1
      2
      3
      4
      5
      6
      7
      8
      9
      sudo docker run --detach \
      --hostname 39.100.247.246 \
      --publish 443:443 --publish 13800:80 --publish 13822:22 \
      --name gitlab_test \
      --restart always \
      --volume $GITLAB_HOME/config:/etc/gitlab \
      --volume $GITLAB_HOME/logs:/var/log/gitlab \
      --volume $GITLAB_HOME/data:/var/opt/gitlab \
      gitlab/gitlab-ee:latest
  • 服务正常运行,有 logs,但是无法访问,注意端口:
    1
    2
    3
    4
    win 查看端口:netstat -ano |findstr "10002"
    linux 查看端口:netstat -anp |grep 80

    # 端口如果正常,看下一些权限问题,如数据映射到本地没有执行权限,给文件夹个 777 权限
  • docker run --name jenkins_cxvh -itd -p 11005:8080 -p 50000:50000 jenkins/jenkins:lts
    1
    2
    3
    4
    5
    6
    7
    # 端口被占用
    bind for 0.0.0.0:50000 failded: port is already allocated

    # 名称被占用
    the container name "/jenkins_cxvh" is already in use by container "45646q45eq6q54weq6".you have to remove (or rename) that container to be....
    # 解决名称占用
    docker rm jenkins_cxvh
  • docker cp e1c25b752479:/tmp/data /tmp/mongo/data
    1
    2
    # 可能是要拷贝的文件不存在
    Error: No such container:path: e1c25b752479:/tmp/data