• 建议:
    win10装桌面docker, Ubuntu装非桌面docker, 直接使用, 不要在win10上还要使用Ubuntu docker, 容器毙

  • 三种docker使用方案,根据不同的系统进行选择

建议性系统配置跳转
建议Ubuntu直接apt 安装docker转到1.1后转二
建议win10带子系统Ubuntu直接安装docker桌面软件转到1.2后传二后传三
不建议win10带子系统Ubuntu安装docker桌面软件作为守护软件, Ubuntu作为客户端转四
不建议的原因是因为docker本来就相当于一个地基, 镜像容器是在这个基础上盖得房子,地基都在win10里面了,为啥还要在Ubuntu中引用这个地基,而且引用的时候肯定不如直接在这个地基上面直接盖房子出现的问题少.

一、docker安装

1.1 Ubuntu apt安装

按照菜鸟 docker安装教程

Ubuntu 18.04 安装 Docker-ce
1.更换国内软件源,推荐中国科技大学的源,稳定速度快(可选)
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
sudo apt update
2.安装需要的包
sudo apt install apt-transport-https ca-certificates software-properties-common curl
3.添加 GPG 密钥,并添加 Docker-ce 软件源,这里还是以中国科技大学的 Docker-ce 源为例
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable"
4.添加成功后更新软件包缓存
sudo apt update
5.安装 Docker-ce
sudo apt install docker-ce
6.设置开机自启动并启动 Docker-ce(安装成功后默认已设置并启动,可忽略)
sudo systemctl enable docker
sudo systemctl start docker
7.测试运行
sudo docker run hello-world
8.添加当前用户到 docker 用户组,可以不用 sudo 运行 docker(可选)
sudo groupadd docker
sudo usermod -aG docker $USER
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
9.测试添加用户组(可选)
docker run hello-world

10 设置镜像容器等保存路径, 毕竟系统盘很小
sudo vim /etc/systemd/system/multi-user.target.wants/docker.service
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# to: 
ExecStart=/usr/bin/dockerd --graph=<your_new_docker_img_path> --storage-driver=overlay

# 上面的方法搞不定用下面的
sudo vi /etc/docker/daemon.json
{
  "data-root": "/data/docker"
}

systemctl daemon-reload # 更新配置文件
service docker start # 重启
docker info # 查看是否成功

1.2 win10 docker桌面软件安装

1.2.1 打开win10功能

在这里插入图片描述

1.2.2 下载安装

点击下载安装软件
在这里插入图片描述
在这里插入图片描述

1.2.3 安装重启打开

注册账号,登录账号

1.4 测试

重启后登录账号后,运行
在这里插入图片描述

  • powershell执行
PS C:\Users\Admin> docker -v
Docker version 19.03.12, build 48a66213fe
PS C:\Users\Admin> docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

二、docker常见命令

个人理解: docker中容器概念相当真实对象, 而镜像概念相当于类代码; 因此可以知道我们的应用是放到对象里面的, 由容器管理, 而将容器打包成文件即为镜像, 可以用于迁移不同的平台; 通常我们使用docker的容器做环境部署, 比如创建个容器(纯净的Ubuntu, Java运行环境, GCC4.9, MySQL), 然后在这些基础开发环境上面进行进一步的开发, 最后将做好的开发直接打包成镜像(环境变文件), 然后将文件发送给对方, 对方再将该文件运行成容器, 就可以实现一键部署.

2.1 基础命令

# 查看容器命令
$ docker ps -a # 打印当前容器运行,可以找到对应镜像容器的ID
$ docker ps -a --filter 'name=tvm' # 匹配names字段中包含tvm的容器信息
$ docker ps --filter status=running # 根据状态信息 正在运行的打印
$ docker ps --filter status=paused # 根据状态信息 挂起的打印
$ docker ps -aqf "name=nginx" # 查看nginix容器的id
$ docker inspect -f '{{.ID}}' stoke # 根据容器名字stoke得到对应ID完整版

# 容器文件与本地文件互传, 这里的长ID也可以换成对应容器的名称
# - `docker cp 本地文件 完整容器ID:容器保存路径`  拷贝本地文件到容器
# - `docker cp 完整容器ID:容器需要拷贝文件路径 本地保存路径`  拷贝本地文件到容器
$ docker cp hello.txt 127108bb3fefb5fbf600**********d4156ae3:/home/
$ docker cp 12710eeffdc*******6b9d314d64d4156ae3:/home/hello_zjq.txt ./
$ docker cp 双击tab键会弹出当前能传文件的容器
$ docker cp a.cc stoke:/home # 这里将a.cc传到容器stoke的/home文件夹中

# 容器启动和关闭
$ docker start 容器ID/容器名 # 启动容器
$ docker stop 容器ID/容器名 # 停止容器
$ docker rm 容器ID或者容器名 # 删除容器

$ docker images # 查看本地镜像
$ docker rmi 镜像名称/镜像ID # 删除镜像

$ docker exec -it ubuntu_test /bin/bash # 进入容器, 退出终端后台依然运行



2.2 打包镜像和加载镜像 本地

# 查看所有镜像
docker images

# 容器制作为镜像img
docker  commit  -m  '镜像描述'  -a  '制作者'  容器名  镜像名
docker commit -a "zjq"   -m "add conda"  ubu_dj   ubuntu_add_conda
docker images
# REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
# ubuntu_add_conda    latest              60e953ece85f        2 hours ago         3.82GB


# 保存镜像到本地 ./ubuntu_add_conda.tar当前路径下ubuntu_add_conda.tar
docker save ubuntu_add_conda -o ./ubuntu_add_conda.tar
zip ubuntu_add_conda.tar.zip ubuntu_add_conda.tar # 压缩镜像, 能缩小一半的空间

# 加载镜像 两种方法
docker load -i ubuntu_add_conda.tar
docker load < ubuntu_add_conda.tar

# 运行镜像成容器 容器名定义为test_zjq
docker  run  -dit  -P --name=test_zjq ubuntu_add_conda.tar

# 设置开机自启动和关闭开机自启动容器
docker update --restart=always 容器名/ID
docker update --restart=no 容器名/ID

docker update --restart=no $(docker ps -q) # 取消所有自启动

2.5 创建容器的选项

docker run -it -p 1024:2558 -v /home/docker/share_dir/data:/data -restart=always --name ubuntu_test ubuntu /bin/bash
# docker run -it运行容器, it是交互终端
# -p 1024:2558 端口映射 本地端口(物理机):容器端口
# -v /home/docker/share_dir/data 共享文件夹data
# :/data 容器内创建data与本地共享
# -restart=always 设置开机自启动该容器
# --name ubuntu_test 设置容器名称为ubuntu_test 
# ubuntu /bin/bash 运行的镜像是Ubuntu

2.6 上传docker镜像到docker hub

先去dockerhub注册账号

docker tag abss/arm64v8-ubuntu:18.04 zjq2048/rk3399-ubuntu:pure
docker login
docker push zjq2048/rk3399-ubuntu:pure

三. win10系统下的docker问题解决

3.1 运行测试用例下载出错

$ docker run hello-world
报错时修改源,即可
鼠标右击点击settings

{
  "registry-mirrors": ["http://hub-mirror.c.163.com"],
  "insecure-registries": [],
  "debug": true,
  "experimental": false
}

在这里插入图片描述
在这里插入图片描述

3.2 运行Ubuntu容器,设置本地共享文件夹, 文件映射

  • 注意:
    win10的文件夹设置的权限在命令行中的docker是无法修改的,因此需要在软件docker的settings中设置, 比如需要用到文件夹share_dir,就需要在软件docker的设置中加入该文件夹的路径(这里在下文创建本地与容器共享文件夹的时候需要用到)
    如下图
    在这里插入图片描述
sudo docker search ubuntu # 搜索可用的版本
docker pull ubuntu # 默认pull 最新版本
docker run -it -v F:/docker/share_dir/django:/django --name ubu_dj ubuntu /bin/bash # 创建容器并运行
  • 创建容器指令介绍:
  • docker run -it 运行容器, it是交互终端
  • -v F:/docker/share_dir/django:/django -v是配置本地与容器共享文件,即文件映射,这里因为已经将该路径F:/docker/share_dir/加载到了软件docker中, 因此这里可以使用, 不然就会在终端报各种错误, F:/docker/share_dir/文件夹中可以没有django, 执行完该命令后自动会在该文件夹中创建django, 后面的:/django表示在Ubuntu中创建目录:/django, 这个目录就是与本地同步的文件夹
  • --name ubu_dj 设置容器名称为ubu_dj
  • ubuntu /bin/bash 运行的镜像是Ubuntu, 如果理解不了就当成软件的安装包, /bin/bash表示以终端显示
# 执行结果
PS C:\Users\Admin> docker run -it -v F:/docker/share_dir/django:/django --name ubu_dj ubuntu /bin/bash # 创建指令
root@ec11679b952c:/# ls
bin  boot  dev  django  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@ec11679b952c:/# touch django/hello # 在共享文件夹中创建文件hello
root@ec11679b952c:/# exit # 退出
exit
PS C:\Users\Admin> ls F:\docker\share_dir\django\ # 查看共享文件夹
-a----       2020/10/26     10:00              0 hello # 这是刚刚在容器中创建的文件

下次启动就可以使用ubu_dj的名字了

PS C:\Users\Admin> docker start ubu_dj
ubu_dj
PS C:\Users\Admin> docker exec -it ubu_dj /bin/bash # 关闭终端后台不停止
root@ec11679b952c:/# 
  • 最后
    通过上述设置, 以后操作docker就可以将重要的文件放到共享文件夹, 方便以后在容器中创建项目;

五. docker应用

5.1 Github项目 stoke的docker安装

github - stoke

# 1.载入镜像
# 这是因为docker中已经增加了当前zjq用户进行操作,因此不需要sudo
$ sudo docker pull stanfordpl/stoke:latest 
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
$ docker pull stanfordpl/stoke:latest 
latest: Pulling from stanfordpl/stoke
e082d4499130: Downloading [=>                                                 ]  1.578MB/67.15MB                        
371450624c9e: Download complete                                                                                         
017e8b42d4a5: Downloading [>                                                  ]   1.58MB/489MB                          
b791b660cd19: Downloading [>                                                  ]  1.578MB/1.395GB       

# 2.查看当前系统中的docker镜像
$ docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
stanfordpl/stoke    latest              07af7725dec5        2 weeks ago         5.54GB
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB

# 3. 进入镜像 ssh方式
docker run -d -P --name stoke stanfordpl/stoke
$ sudo docker port stoke 22 # 端口映射
0.0.0.0:XXXXX
$ ssh -pXXXXX stoke@127.0.0.1 # 访问端口
(password is 'stoke') # 密码默认stoke
# 下面是进入ssh访问
./configure.sh
make
exit # 退出
# ssh登出
docker ps -a # 查看容器ID
docker stop 容器ID  # 关闭对应容器

# 3.进入对应的镜像 # 进入stoke的容器(这一步是run了一个容器)
$ docker run -i -t stanfordpl/stoke /bin/bash 
root@3dc5f89dc8db:/# cat /etc/hosts  
# 这里已经进入了stoke的镜像,默认都是root用户,hosts就是镜像信息;
# 3dc5f89dc8db是容器ID,下载可以直接通过容器ID进入容器
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      3dc5f89dc8db
root@3dc5f89dc8db:/# exit # 退出

5.2 mysql镜像和容器安装和访问使用

  • 创建路径, 并包含三个文件夹
    在这里插入图片描述
  • 在docker中加入这个路径
    在这里插入图片描述
  • 正式安装
# 下载镜像, 版本可选5.5,5.6,5.7,8.0, 这里是5.7
docker pull mysql:5.7

# 运行容器
docker run -p 3308:3306 --name m1 -e MYSQL_ROOT_PASSWORD=123456 -v F:\docker\mysql5.7\data:/var/lib/mysql -d mysql:5.7

70bde0f66e37946d8a00e7427d59bfd30316db84b9419b397df2d55c373dd6f9
注意
一定要加 -it表示直接运行 
-d mysql:5.7要在最后

# 参数解释:
--name 容器名字
-p 3308:3306 物理机端口:容器内部端口, 如果本地也有mysql,默认本地是3306, 这时候需要修改为-p 3308:3306
-e 运行参数 初始化 root 用户的密码为123456
-d 后台运行 mysql/mysql-server:5.7 下载的镜像名字加标签
# 映射同步到本地的三个文件夹下,就是刚新建的文件夹, 因为mysql重要的文件都在这三个文件夹中
-v F:\docker\mysql5.7\conf:/etc/mysql 
-v F:\docker\mysql5.7\logs:/var/log/mysql 
-v F:\docker\mysql5.7\data:/var/lib/mysql

docker ps -a # 查看当前容器
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                     PORTS                               NAMES
ed8f2e2547e7        mysql:5.7             "docker-entrypoint.s…"   5 minutes ago       Up 5 minutes               33060/tcp, 0.0.0.0:3308->3306/tcp   m1

# 进入容器
$ docker start m1
$ docker exec -it m1 /bin/bash
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'
#报错原因是因为没有管路员权限, 重新使用powershell管理员执行上面命令

# 进入mysql
mysql -u root -p
# 密码输入刚创建容器时设置的123456
# 如果出错,就直接回车试试

# 修改密码
mysql> ALTER USER 'root'@"localhost" identified BY '***' PASSWORD EXPIRE NEVER;
Query OK, 0 rows affected (0.02 sec)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '***';
Query OK, 0 rows affected (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

#修改mysql允许远程连接, 上面的命令不行换下面的
GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "zjq";
GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "zjq" WITH GRANT 
flush privileges;

注意 -v F:\docker\mysql5.7\data:/var/lib/mysql目的是为了将数据库的内容放到本地, 因为mysql创建的数据库都保存到了/var/lib/mysql文件夹中,当容器坏掉或者有其他误操作的时候, 至少数据还在本地不慌.

  • 在本地的Navicat访问mysql, 建立后双击即可
    在这里插入图片描述

5.3 overleaf本地搭建

论文1 overleaf 配置本地服务器

5.4 Ubuntu容器创建和操作

# 利用Ubuntu镜像创建容器
# --name zc_ubuntu 命名容器为zc_ubuntu
# -v /home/disk2T/zc/zc_ubuntu/:/home/zc_ubuntu 将容器内的/home/zc_ubuntu与本机的/home/disk2T/zc/zc_ubuntu/进行映射
# ubuntu, 通过docker images查看到的Ubuntu镜像名称
# -p 1025:8889 本地端口号1025映射到容器端口号8889
$ docker run -itd -p 1025:8889 --name zc_ubuntu -v /home/本地文件夹:/容器内文件夹 -d ubuntu:18.04 /bin/bash

# 运行容器
$ docker exec -it zc_ubuntu /bin/bash

# 查看容器
docker ps -a --filter "name=zc_ubuntu" 

创建的容器是纯净的, 所以需要重写源, 安装vim编译器等
具体跳转Ubuntu全解第七章

5.5 查看容器大小

docker system df -v # 查看容器所占空间大小
docker system df # 查看所有汇总的数据信息

如果出现错误:
Error response from daemon: a disk usage operation is already running

是因为执行了上面的命令后还没print结果就被中断了, 所以她在后台还在努力搜索统计, 因此要解决上面的问题, 只需要等待一会, 在重新运行即可

5.6 修改容器内系统时间一直

docker cp /etc/localtime 容器名:/etc/localtime

六. 笔记本ssh连接docker容器 (VScode连接)

方法一. 设置容器密码进行ssh链接

docker run -itd -p 1025:8888-p 1000:8891--name zc_ubuntu -v /home/本地文件夹:/容器内文件夹 -d ubuntu:18.04 /bin/bash

比如这里创建的容器中, 包含端口映射两个, 其中8888是jupyter的端口, 也就是说开启这个容器访问ip地址:1025其实是访问容器里面的8888端口; 而这个1000:8891端口的映射就可以作为ssh的端口, 外部访问ip地址:1000就是通过ssh直接访问这个容器了

下面给出具体的操作方式

# docker run -itd -p 1025:8888 -p 1000:8891

# 容器端设置
passwd # 设置里面的容器密码 xxxx
vi /etc/ssh/sshd_config # 修改ssh端口, root权限可以登录等
# 注意 ssh默认端口号其实是22
Port 8891
AddressFamily any
RSAAuthentication yes # 打开秘钥登录
PubkeyAuthentication yes
PermitRootLogin yes # 这是root用户能够登录
PasswordAuthentication yes
PermitEmptyPasswords yes

service ssh restart # 生效配置, 重启ssh服务
netstat -anp | grep -i sshd # 查看端口号
# 这里应该显示 ssh:8891


# 本地笔记本端登录测试
# 这里就是访问ip地址对应的端口号1000下的root用户, 相当于访问 ssh root@容器
ssh -p 1000 root@ip地址
# 输入刚的密码 xxxx

然后在VScode编辑器中安装插件 remote-ssh

在这里插入图片描述

然后就可以通过左侧那个小电脑上面选择连接远程ssh连接了

方法二. 秘钥连接

首先: 本地笔记本操作 powershell 管理员方式打开

ssh-keygen -t rsa -b 4096 # 4096这得是长度
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\admin/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): # 这里输入密码 如果这里直接回车, 就可以直接登陆了
Enter same passphrase again:
Your identification has been saved in C:\Users\admin/.ssh/id_rsa. # 私钥保存位置
Your public key has been saved in C:\Users\admin/.ssh/id_rsa.pub. # 公钥保存位置
The key fingerprint is:
SHA256:/R953Sq9QUeya3pig+8cFV/fkXjSbDSpAwcm1D admin@DESKTOP-B5SJ9B4
The key's randomart image is:
+---[RSA 4096]----+
|           +==+. |
+----[SHA256]-----+

# 通过文本编辑器打开公钥(C:\Users\admin/.ssh/id_rsa.pub), 复制公钥数据里面的所有内容, 进入到容器里面添加公钥数据
root@fcaa25bce:$ vi /root/.ssh/authorized_keys

# 测试
# 登录容器: root@fcaa25bce, IP是服务器的IP, root是容器的root, 1000是服务器的端口映射到容器的8890端口
ssh  -i C:\Users\admin/.ssh/id_rsa root@服务器IP -p 1000 # 直接就进来了

然后就在VScode里面添加一下就好了

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐