bootstrapPage() creates an empty container (not even a div tag, just a list of HTML tags which happens to have zero elements), with metadata attached to load the Bootstrap CSS and JS assets. If you want to stay in R for defining your UI, you can pass in any HTML objects as children of bootstrapPage.
bootstrapPage(
tags$div(id = "mainContainer",
"This is text in the main container"
),
tags$button(class = "btn btn-primary", "Here's a button")
)
Note that when you define your UI in R, you shouldn't insert the outer <html> or <body> tags, those are implied.
You can also write raw HTML if you want, or combine raw HTML with R calls. It should all be described in the video "Shiny UI" by Garrett Grolemund, on this page: