我是靠谱客的博主 勤恳火车,最近开发中收集的这篇文章主要介绍Linux 系统下 docker 搭建和使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

      • 1 docker 搭建
      • 2 docker 使用
        • 2.1 查看 docker 镜像
        • 2.2 给镜像重名
        • 2.3 docker 常用命令
        • 2.4 docker启动常用命令
        • 2.5 容器操作
        • 2.6 保存容器为新的镜像
        • 2.7 文件传输
        • 2.8 挂载
        • 2.9 docker 服务的启动和关闭
        • 2.10 docker 镜像保存与导入
        • 2.11 docker 使用的主要命令
      • 3 docker 存储目录的更改
          • 方法一:软链接(建议使用)
          • 方法二:直接更改目录方法
      • 4 docker 使用小 tips,方便你我他的小设置
        • 4.1 用户权限问题,添加新用户后挂载目录无法读取。
        • 4.2 通过ssh 连接容器
      • 5 docker 服务器搭建容器整体流程梳理
        • docker 挂载
        • docker container 的脚本文件在 notion
      • 6 Docker 问答录
      • 7 搭建 wiki
      • 8 搭建 xwiki

1 docker 搭建

docker 官方文档地址: https://docs.docker.com/engine/reference/commandline/docker/

安装方法官方文档:https://docs.docker.com/engine/install/ubuntu/#prerequisites

单用户授权: https://docs.docker.com/engine/install/linux-postinstall/

# 卸载之前的docker
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装docker 需要的包
sudo apt-get update
sudo apt-get install 
ca-certificates 
curl 
gnupg 
lsb-release
# docker 添加证书
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 本地的稳定安装
echo 
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu 
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# docker 安装
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 用户加入docker 组别
# sudo groupadd docker
# 默认是有的
sudo usermod -aG docker $USER

出现下列信息说明安装成功。

Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/

2 docker 使用

2.1 查看 docker 镜像

docker image ls

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8CziOVTe-1642650775496)(D:Program_FilesTyporaPicutreDocker01.png)]

  • REPOSITORY: 来自于哪个仓库;
  • TAG: 镜像的标签信息,比如 5.7、latest 表示不同的版本信息;
  • IMAGE ID: 镜像的 ID, 如果您看到两个 ID 完全相同,那么实际上,它们指向的是同一个镜像,只是标签名称不同罢了;
  • CREATED: 镜像最后的更新时间;
  • SIZE: 镜像的大小,优秀的镜像一般体积都比较小,这也是我更倾向于使用轻量级的 alpine 版本的原因;

2.2 给镜像重名

docker tag ubuntu:15.10 ubuntu15.10
docker image ls
#### 显示信息
REPOSITORY
TAG
IMAGE ID
CREATED
SIZE
hello-world
latest
feb5d9fea6a5
3 months ago
13.3kB
ubuntu15.10
latest
9b9cb95443b5
5 years ago
137MB
ubuntu
15.10
9b9cb95443b5
5 years ago
137MB

2.3 docker 常用命令

#### 查看镜像的详细信息
docker inspect ubuntu15.10
#### 查看镜像历史信息
docker history ubuntu15.10

2.4 docker启动常用命令

所需要的命令主要为 docker run

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从 registry 下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止
# 查看docker中已下载的镜像
docker images
# 通过 docker中的一个镜像生成并进入容器
docker run ubuntu:18.04 /bin/echo 'Hello world'
# -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开
docker run -t -i ubuntu:18.04 /bin/bash
# 分配终端,挂载本地文件启动,同时给容器命名,( 进入容器时既可以指定容器名,也可以指定容器ID )
docker run -it --name="userTest001" -v
/opt/work/opt_user/:/home/mntdata
ubuntu_env_true:latest /bin/bash
# 修改容器名
docker rename userTest001 user_test
# 启动已终止容器
docker container start
# 查看终止状态的容器
docker container ls -a
# 查看运行状态的容器
docker container ls

2.5 容器操作

# 查看 docker 中所有的容器
docker ps -a
# (-aq 只有容器id , -a 有状态显示 )
docker ps -aq
docker container ls -a
# (有状态显示)
# 进入 containerID 为 83806d576f69 的容器( exec 以互不打扰的方式重开一个命令行)
docker exec -it f59522c03264 /bin/bash
docker exec -it -u root f59522c03264 /bin/bash
# 启动、停止某个容器
docker start 83806d576f69
docker stop 83806d576f69
docker container stop $(docker ps -aq)
# 删除容器(83806d576f69 为容器的 containerID ,上面的命令可查看),前提是!!!容器已停止运行
docker stop 83806d576f69
docker rm 83806d576f69
## 输出镜像的 id 全称
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=9b9cb95443b5)
#### 删除 镜像
docker rmi e508bd6d6
# 复制文件
docker cp mycontainer:/opt/file.txt /opt/local/
docker cp /opt/local/file.txt mycontainer:/opt/
#### !!!!!! 不要轻易使用
# 删除所有不使用的镜像
docker image prune --force --all 或者 docker image prune
-a
(谨慎添加
-f )
# 删除所有停止的容器
docker container prune
(谨慎添加
-f )
# 进入容器(两个终端输入命令不同时出现)
docker container start
98f
docker exec -it 98f /bin/bash

2.6 保存容器为新的镜像

# 基于已有的docker容器,做一新的dokcer image. 
# 前提是:先停止容器 !!!!!!!!!
docker stop <old_container_id>
docker commit <old_container_id> <new_image_name>
docker ps -l
docker stop 6d83def2eb81
docker commit 6d83def2eb81 ubuntu15.10.new
docker images

2.7 文件传输

# 主机和容器互相传输命令
docker cp 98f3b5ce5:/home/root_98f3b5ce5d14
/home/xxx/
docker cp
root_host_dir/
98f3b5ce5:/home/
docker cp 容器id:容器内路径 主机目的路径
docker cp 主机目的路径 容器id:容器内路径
# 查看docker中已下载的镜像
docker images

2.8 挂载

docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口
docker run -it -v /home/ceshi:/home centos /bin/bash
docker run
-it -v /opt/work/dockerdata:/home/data
ubuntu_env_true /bin/bash
#通过 docker inspect 容器id 查看

2.9 docker 服务的启动和关闭

systemctl stop docker
systemctl restart docker

2.10 docker 镜像保存与导入

docker save imageID > filename
# 或者 用 REPOSITORY
docker save ubuntu_user:latest > ubuntu_user.tar
docker load < filename

2.11 docker 使用的主要命令

 # 查看docker中已下载的镜像
docker images
# 查看docker中已安装的容器
docker ps -a
# 通过镜像生成并启动一个容器
docker run -it ubuntu_env_true:latest /bin/bash
exit
# 以挂载的方式生成并启动一个容器
docker run
-it -v /host_filename:/home/data
ubuntu_env_true /bin/bash
# 以挂载的方式生成并启动一个容器,同时给容器的名称命名为 userTest001
docker run -it --name="userTest001" -v
/opt/work/opt_ldf/:/home/mntdata
ubuntu_env_true:latest /bin/bash
# 修改容器名
docker rename userTest001 user_test
# 启动容器、停止容器、停止所用容器
docker container start
b7fd710a3fbc(containerID/Name)
docker container stop
b7fd710a3fbc
docker container stop $(docker ps -aq)
# 进入容器,以互不打扰命令行的方式进入容器。
docker exec -it 98f(containerID/Name) /bin/bash
# 主机和容器互相传输命令
docker cp 容器id:容器内路径 主机目的路径
docker cp 主机目的路径 容器id:容器内路径
docker cp
98f3b5ce5:/home/file
/home/xxx/
docker cp
host_root_host_dir/
98f3b5ce5:/home/file
# 保存容器
# 查看当前容器状态,停止所有容器,查看容器状态,需保存的容器状态为停止,保存容器为新的镜像。
docker ps -a
docker container stop $(docker ps -aq)
docker ps -a
docker commit
b6e38a990eb6 ubuntu_env_true
docker images
# 删除容器(83806d576f69 为容器的id,上面的命令可查看),先停止容器!!!
# 删除的前提是容器已停止运行!!!!!
docker ps -a
docker container stop 83806d576f69
docker rm 83806d576f69
# 删除镜像
docker rmi e508bd6d6(imageID)
#### !!!!!! 不要轻易使用
# 删除所有不使用的镜像
docker image prune --force --all或者docker image prune
-a
(谨慎添加
-f )
# 删除所有停止的容器
docker container prune
(谨慎添加
-f )

3 docker 存储目录的更改

方法一:软链接(建议使用)
# 查找 docker 的存储目录
sudo docker info | grep "Docker Root Dir"
# 关掉 docker 服务
systemctl stop docker
# 移动目录到想要存储的目录
mv /var/lib/docker
/home/work/docker_root
# 软链接,在需要存储的目录下创建一个软链接,链接到 docker 的默认目录。
ln -s src_Dir dst_Dir
ln -s /home/work/docker_root
/var/lib/docker
# 重启 docker 服务
systemctl restart docker
# 查看,并运行一个做测试
docker images
docker run -it ubuntu_env_true:latest /bin/bash
方法二:直接更改目录方法
### 官方文档的修改办法是编辑 /etc/docker/daemon.json 文件,
### 默认情况下这个配置文件是没有的,我们需要新建一个
touch
daemon.json
### 写入下列内容
{
"data-root": "/www/docker"
}
### 此文件还涉及默认源的设定,如果设定了国内源,那么实际就是在源地址下方加一行,写成:
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"data-root": "/www/docker"
}
### 保存退出,然后重启 docker 服务:
systemctl restart docker
### 查找 docker 的存储目录,验证修改
sudo docker info | grep "Docker Root Dir"

4 docker 使用小 tips,方便你我他的小设置

4.1 用户权限问题,添加新用户后挂载目录无法读取。

容器内修改 /etc/passwd 文件的用户 id ,让他和挂载目录的id 一样

sed -i "s/${username}:x:1000:1000/${username}:x:${uid}:${gid}/" /etc/passwd
sed -i "s/${username}:x:1000/${username}:x:${gid}/" /etc/group

4.2 通过ssh 连接容器

通过 ssh 连接容器可实现 权限控制问题,只能读取某个特定的权限

ssh username@xx.xx.xx.xx -p xxxx

5 docker 服务器搭建容器整体流程梳理

为用户新建容器,并挂载,并开放端口号让用户连接,同时修改用户uid 让其不受访问限制。

# 新建容器供用户使用的完整流程。
# ----------------------------------------------------------------------------------------------
# 查看当前 端口是否被占用
netstat -ntulp |grep 10000
netstat -ntulp |grep 22
netstat -anp|grep 22
# 挂载、命名、生成容器
docker run -it -p 10000:22 userTestssh /bin/bash
docker run -it --name="user" -p 10000:22
ubuntu_git_ssh /bin/bash
docker run -it --name="user" -p 10000:22 -v /home/user:/home/user -v /home/down/:/home/down/ ubuntu_init_ssh /bin/bash
docker run -it --name="user" --device /dev/net/tun:/dev/net/tun -p 10000:22 -v /home/user:/home/user
ubuntu_yocto_clean:latest /bin/bash
docker run -it --name="user" --privileged
-p 10000:22
-v /home/user:/home/user
ubuntu_yocto_clean:latest /bin/bash
docker exec -it -p 10000:22 userTestssh /bin/bash
# 容器挨个新建用户,挨个赋权限测试
# sudo adduser user
addgroup SoftSec1 --force-badname
useradd -m user
usermod -g SoftSec1 user
usermod -s /bin/bash
user
passwd user
# 修改用户id , 组id
vi /etc/passwd
# user id
vi /etc/group
# SoftSec1 id
# Ubuntu添加用户并赋sudo权限
usermod -aG sudo user
id user
# ssh 连接测试
# 容器
docker container start user
docker exec -it user /bin/bash /etc/init.d/ssh start
docker ps -a
ssh user@xxxxxxxx -p 10000

docker 挂载

docker 挂载文件系统,如果docker 有挂载权限 mount /dev/sdd /opt

# --privileged=true 允许挂载的危险操作 !!!! 谨慎使用!
docker run -it --name="test_mount" --privileged=true -p 10000:22 ubuntu_ssh:latest /bin/bash
# mount 挂载
cd .
# 刷新当前目录,mount 挂载后要先刷新当前目录,才能体现出挂载的文件
ls -l
# 刷新后查看,已有文件。
mount /dev/sdb /opt/
ls
df -h
cd .
ll
dd if=/dev/zero of=./test.ext4 bs=1M count=10
# 制作文件系统
sync
sudo mkfs.ext4 test.ext4 -F
mkfs.ext4 test.ext4 -F
mkdir test_mntdir
mount test.ext4 test_mntdir/
cd test
cd test_mntdir/
ls
history
#### output:
# -----------------------------------------------------------------------------------
root@eb12da5ce152:/opt# dd if=/dev/zero of=./test.ext4 bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0056286 s, 1.9 GB/s
root@eb12da5ce152:/opt# sync
root@eb12da5ce152:/opt# mk^C
root@eb12da5ce152:/opt# ^C
root@eb12da5ce152:/opt# ^C
root@eb12da5ce152:/opt# sudo mkfs.ext4 test.ext4 -F
bash: sudo: command not found
root@eb12da5ce152:/opt# mkfs.ext4 test.ext4 -F
mke2fs 1.44.1 (24-Mar-2018)
Discarding device blocks: done
Creating filesystem with 10240 1k blocks and 2560 inodes
Filesystem UUID: cca0f45a-03b2-455f-8456-09f803c5dc71
Superblock backups stored on blocks:
8193
Allocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
root@eb12da5ce152:/opt# mkdir test_mntdir
root@eb12da5ce152:/opt# mount test.ext4 test_mntdir/
root@eb12da5ce152:/opt# cd test
bash: cd: test: No such file or directory
root@eb12da5ce152:/opt# ls^C
root@eb12da5ce152:/opt# cd test_mntdir/
root@eb12da5ce152:/opt/test_mntdir# ls
lost+found
# -----------------------------------------------------------------------------------

docker container 的脚本文件在 notion

qweqw

6 Docker 问答录

Docker 问答录: https://blog.lab99.org/post/docker-2016-07-14-faq.html

7 搭建 wiki

docker pull mysql
docker run -d -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf:/etc/mysql/conf.d --name mysql -e TZ=Asia/Shanghai
-e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 mysql:latest
docker exec -it mysql bash
mysql -uroot -p
use mysql;
create user 'wiki'@'localhost' identified by '1234';
create user 'wiki'@'%' identified by '1234';
create database `wiki`;
grant all privileges on wiki.* to 'wiki'@'localhost';
grant all privileges on wiki.* to 'wiki'@'%';
flush privileges;select host,user,authentication_string,plugin from user;
alter user 'wiki'@'%' identified with mysql_native_password by '1234';
docker run -d -p 82:3000 --name wiki --restart unless-stopped -e "DB_TYPE=mysql" -e "DB_HOST=192.168.1.198" -e "DB_PORT=3306" -e "DB_USER=wiki" -e "DB_PASS=1234" -e "DB_NAME=wiki" requarks/wiki:latest
http://172.17.0.3:3000

8 搭建 xwiki

# 使用docker搭建xwiki
# 部署xwiki
# 使用docker现成的xwiki模板来部署
# 查看端口号
netstat -tln | grep 10000
# 创建网络
docker network create -d bridge xwiki-nw
# 创建mysql
docker run --net=xwiki-nw --name mysql-xwiki -v /home/project/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xwiki -e MYSQL_USER=xwiki -e MYSQL_PASSWORD=xwiki -e MYSQL_DATABASE=xwiki -d mysql:5.7 --character-set-server=utf8 --collation-server=utf8_bin --explicit-defaults-for-timestamp=1
# 创建xwiki
docker run -d --net=xwiki-nw --name xwiki -p 10000:8080 -v /home/project/xwiki:/usr/local/xwiki -e DB_USER=xwiki -e DB_PASSWORD=xwiki -e DB_DATABASE=xwiki -e DB_HOST=mysql-xwiki xwiki:mysql-tomcat

最后

以上就是勤恳火车为你收集整理的Linux 系统下 docker 搭建和使用的全部内容,希望文章能够帮你解决Linux 系统下 docker 搭建和使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部